получить только целое число из wc в bash
есть ли способ получить целое число, которое wc возвращает в bash?
в основном я хочу написать номера строк и количество слов на экране после имени файла.
output: filename linecount wordcount
Вот что у меня пока:
files=`ls`
for f in $files;
do
if [ ! -d $f ] #only print out information about files !directories
then
# some way of getting the wc integers into shell variables and then printing them
echo "$f $lines $ words"
fi
done
15 ответов:
можно использовать
cut
команда, чтобы получить только первое словоwc
's выход (который является количество строк или слов):lines=`wc -l $f | cut -f1 -d' '` words=`wc -w $f | cut -f1 -d' '`
wc $file | awk {'print "" "" ""'}
настройка по мере необходимости для вашего макета.
также лучше использовать положительную логику ("это файл") над отрицательной ("не каталог")
[ -f $file ] && wc $file | awk {'print "" "" ""'}
иногда выходы wc в разных форматах на разных платформах. Например:
в OS X:
$ echo aa | wc -l 1
В Centos:
$ echo aa | wc -l 1
таким образом, используя только вырезать не может получить номер. Вместо того, чтобы попробовать тр для удаления пробельных символов:
$ echo aa | wc -l | tr -d ' '
принят/популярные ответы не работа на OSX.
любое из следующего должно быть переносимым на bsd и linux.
wc -l < $f | tr -d ' '
или
wc -l $f | tr -s ' ' | cut -d ' ' -f 2
или
wc -l $f | awk '{print }'
если вы перенаправите имя файла в
wc
он опускает имя файла на выходе.Баш:
read lines words characters <<< $(wc < filename)
или
read lines words characters <<EOF $(wc < filename) EOF
вместо
for
для итерации по выходуls
сделайте так:for f in *
который будет работать, если есть имена файлов, содержащие пробелы.
если вы не можете использовать подстановку, вы должны трубу в
while read
петли:find ... | while read -r f
или использовать процесс замещения
while read -r f do something done < <(find ...)
если файл маленький, вы можете позволить себе позвонить
wc
дважды, и использовать что-то вроде следующего, что позволяет избежать трубопроводы в дополнительный процесс:lines=$((`wc -l $f`)) words=$((`wc -w $f`))
The
$((...))
- это Арифметические Расширения Баш. Он удаляет любые пробелы из выходных данныхwc
в этом случае.такое решение имеет больше смысла, если вам нужно или linecount или в приложения WordCount.
попробуйте это:
wc `ls` | awk '{ LINE += ; WC += } END { print "lines: " LINE " words: " WC }'
он создает счетчик строк и количество слов (строка и WC) и увеличивает их со значениями, извлеченными из wc (используя $1 для значения первого столбца и $2 для второго), и, наконец, печатает результаты.