Могу ли я добавить имена файлов рядом со значением счетчика строк в конкретный файл с помощью цикла for? - PullRequest
0 голосов
/ 05 июня 2019

У меня 3 файла, test1, test2, test3.

Я пытаюсь поместить количество строк каждого файла и имя файла в список, а затем этот список в теле письма.

Это грубый набросокчто у меня так далеко.Я не уверен, как получить имя файла в файл email-body.Я знаю, как отправить электронное письмо с текстом email-body.

#!/bin/bash

FILE=/home/tst/test-dir/${@:1}

for files in $FILE
 do
  cat $files |wc >> temp-word-count;
  cut -d " " -f 7 temp-word-count > email-body;
 done

Ответы [ 4 ]

1 голос
/ 05 июня 2019

wc уже делает всю работу за вас и перечисляет имена файлов с количеством строк:

$ wc -l test?
 3 test1
 6 test2
 2 test3
11 total

Итак, если ваши файлы живут в /home/tst/test-dir, вы можете использовать что-то вроде

wc -l /home/tst/test-dir/test? > email-body
1 голос
/ 05 июня 2019

Если вы просто передаете отдельные имена файлов в качестве аргументов в ваш скрипт, которые находятся в вашем каталоге /home/tst/test-dir, и вы хотите счетчик строк и имя файла в email-body, то вы можете использовать простой цикл, например,

#!/bin/bash

dir=/home/tst/test-dir

:> email-body       ## truncate email-body before each use
for files in "$@"   ## loop over arguments
do
    wc -l "$dir/$files" >> email-body   ## add line-count and name to email
done

Пример использования / Вывод

Используя мой каталог $HOME/tmpd и вызывая скрипт как:

$ bash tmp/embody.sh afile cmtfile file sfile

приводит к файлу email-body в данном каталоге, содержащему:

$ cat email-body
8 /home/david/tmpd/afile
8 /home/david/tmpd/cmtfile
6 /home/david/tmpd/file
12 /home/david/tmpd/sfile

Другой вариант, который будет несколько более эффективным, - просто перенаправить вывод цикла for один раз во время завершения, например,

#!/bin/bash

dir=/home/tst/test-dir

for files in "$@"           ## loop over arguments
do
    wc -l "$dir/$files"     ## output line-count and name
done > email-body           ## single redirect to email at end of loop

Это также исключает необходимость усечения перед циклом. (тот же вывод в email-body)

0 голосов
/ 05 июня 2019

Не могли бы вы попробовать следующее (еще не проверял).

awk '
FNR==1 && prev{
  print prev_file, prev
}
FNR==1{
  prev_file=FILENAME
}
{
  prev=FNR
}
END{
  print prev_file, prev
}  
' "/home/tst/test-dir/${@:1}" > email-body
0 голосов
/ 05 июня 2019
awk '
{ numLines[FILENAME]++ }
END {
    for (i=1; i<ARGC; i++) {
        fname = ARGV[i]
        print fname, numLines[fname]+0
    }
}
' "/home/tst/test-dir/${@:1}" > email-body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...