Linux 合并greps以生成脚本来计算文件夹中的文件

Linux 合并greps以生成脚本来计算文件夹中的文件,linux,bash,scripting,awk,grep,Linux,Bash,Scripting,Awk,Grep,我需要一些帮助组合脚本元素以形成读取输出 基本上,我需要为下面列出的文件夹结构获取用户的文件名,并使用count为文件类型为*.ano的用户计算文件夹中的行数 这显示在下面的摘录中,以注意文件名上的位置并不总是从前面开始计数相同 /home/user/Drive backup/2010 backup/2010 Account/Jan/username needtogrep/user.dir/4.txt /home/user/Drive backup/2011 backup/2010 Accoun

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

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

这显示在下面的摘录中,以注意文件名上的位置并不总是从前面开始计数相同

/home/user/Drive backup/2010 backup/2010 Account/Jan/username needtogrep/user.dir/4.txt

/home/user/Drive backup/2011 backup/2010 Account/Jan/username needtogrep/user.dir/3.ano

/home/user/Drive backup/2010 backup/2010 Account/Jan/username needtogrep/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

查看。

从文件夹执行下面的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

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

find "$dir" -iname '*.ano' | wc -l
如果要对某个目录中的所有目录执行此操作,可以使用for循环:

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

这可能是您想要的(未测试):关联数组需要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
如果您的awk是正确的,那么应该为您提供每个用户的“*.ano”文件数。我经常使用sort/uniq-c来计算字符串实例的数量,在本例中是username,而不是“wc-l”只计算输入行


享受。

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


@谢谢,我不知道wc,但仍然需要将所有元素组合在一起以获得输出的文本文件。这些答案中的一些是可怕的,即使它们工作完美
ar=(“${@%/*}”)printf”%s\000“${ar[]]/*}”
看起来像是绝对的胡言乱语,这是作为一个十多年来一直在编写Perl的人说的。如果这是您将要使用一段时间的东西,请帮自己一个忙,并在选择解决方案时考虑可维护性。
find /home -name '*.ano' | awk -F/ '{print $(NF-2)}' | sort | uniq -c
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