Объединение greps для создания скрипта для подсчета файлов в папке - PullRequest
0 голосов
/ 17 июня 2011

Мне нужна помощь в объединении элементов скриптов для формирования результата чтения.

В основном мне нужно получить имя файла пользователя для структуры папок, перечисленной ниже, и использовать количество строк в папке для этого пользователя с типом файла * .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 ]

1 голос
/ 17 июня 2011
find /home -name '*.ano' | awk -F/ '{print $(NF-2)}' | sort | uniq -c

Это должно дать вам количество файлов "* .ano" на пользователя, если ваш awk верен. Я часто использую sort / uniq -c для подсчета количества экземпляров строки, в данном случае для имени пользователя, в отличие от 'wc -l', считающего только входные строки.

Наслаждайтесь.

0 голосов
/ 18 июня 2011

Вот еще один способ сделать это (в 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
0 голосов
/ 17 июня 2011

Это может быть тем, что вы хотите (не проверено): требуется 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
0 голосов
/ 17 июня 2011

Чтобы подсчитать количество * .ano файлов в каталоге, вы можете использовать

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

Если вы хотите сделать это для всех каталогов в некотором каталоге, вы можете просто использовать цикл for:

for dir in * ; do
    echo "user $dir"
    find "$dir" -iname '*.ano' | wc -l
done
0 голосов
/ 17 июня 2011

Выполните приведенный ниже 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
0 голосов
/ 17 июня 2011

Посмотрите на wc (количество слов) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...