结合greps使脚本计算文件夹中的文件

时间:2011-06-17 09:44:41

标签: linux bash scripting awk grep

我需要一些帮助来组合脚本元素以形成读取输出。

基本上我需要为下面列出的文件夹结构获取用户的文件名,并使用文件类型* .ano

计算该用户文件夹中的行数。

这在下面的摘录中显示,要注意文件名上的位置并不总是与前面相同。

/ home / user / Drive-backup / 2010 Backup / 2010 Account / Jan / usernameneedtogrep / user.dir / 4.txt

/ home / user / Drive-backup / 2011 Backup / 2010 Account / Jan / usernameneedtogrep / user.dir / 3.ano

/ home / user / Drive-backup / 2010 Backup / 2010 Account / Jan / usernameneedtogrep / user.dir / 4.ano

awk -F/ '{print $(NF-2)}'

这将为我提供我需要的用户名,但我还需要知道他们在该用户文件夹中有多少非空行用于文件类型* .ano。我有下面的grep工作,但我不知道如何将它们放在一起所以它可以输出一个有意义的文件。

grep -cv '^[[:space:]]*$' *.ano | awk -F: '{ s+=$2 } END { print s }'

需要输出示例

UserA   500
UserB 2
UserC 20

6 个答案:

答案 0 :(得分:1)

find /home -name '*.ano' | awk -F/ '{print $(NF-2)}' | sort | uniq -c

如果您的awk是正确的,那么应该为每个用户提供“* .ano”文件的数量。我经常使用sort / uniq -c来计算字符串的实例数,在本例中是username,而不是'wc -l'只计算输入行。

享受。

答案 1 :(得分:0)

查看wc (word count)

答案 2 :(得分:0)

从文件夹

执行下面的bash脚本
/home/user/Drive-backup/2010 Backup/2010 Account/Jan

它将报告每个用户的非空行数。

#!/bin/bash

#save where we start
base=$(pwd)
# get all top-level dirs, skip '.'
D=$(find . \( -type d ! -name . -prune \))

for d in $D; do
    cd $base
    cd $d
    # search for all files named *.ano and count blank lines
    sum=$(find . -type f -name *.ano -exec grep -cv '^[[:space:]]*$' {} \; | awk '{sum+=$0}END{print sum}')
    echo $d $sum
done

答案 3 :(得分:0)

要计算您可以使用的目录中的* .ano文件数

find "$dir" -iname '*.ano' | wc -l

如果要对某些目录中的所有目录执行此操作,可以使用for循环:

for dir in * ; do
    echo "user $dir"
    find "$dir" -iname '*.ano' | wc -l
done

答案 4 :(得分:0)

这可能是您想要的(未经测试):需要bash版本4用于关联数组

declare -A count
cd /home/user/Drive-backup
for userdir in */*/*/*; do
    username=${userdir##*/}
    lines=$(grep -cv '^[[:space:]]$' $userdir/user.dir/*.ano | awk '{sum += $2} END {print sum}')
    (( count[$username] += lines ))
done

for user in "${!count[@]}"; do
    echo $user ${count[$user]}
done

答案 5 :(得分:0)

这是另一种方法(在Mac OS X 10.6上):

find -x "$PWD" -type f -iname "*.ano" -exec bash -c '
  ar=( "${@%/*}" )                 # perform a "dirname" command on every array item
  printf "%s\000" "${ar[@]%/*}"    # do a second "dirname" and add a null byte to every array item
' arg0 '{}' + | sort -uz | 
while IFS="" read -r -d '' userDir; do
  # to-do: customize output to get example output needed
  echo "$userDir"
  basename "$userDir"
  find -x "${userDir}" -type f -iname "*.ano" -print0 |
  xargs -0 -n 500 grep -hcv '^[[:space:]]*$' | awk '{ s+=$0 } END { print s }'
  #xargs -0 -n 500 grep -cv '^[[:space:]]*$' | awk -F: '{ s+=$NF } END { print s }'
  printf '%s\n' '----------'
done