результаты wc как переменные

Я хотел бы использовать строки из 'wc' в качестве переменных. Например:

echo 'foo bar' > file.txt
echo 'blah blah blah' >> file.txt
wc file.txt

2  5 23 file.txt

Я хотел бы иметь что-то вроде $ lines , $ words и $ символов , связанных со значениями 2 , 5 ​​и 23 . Как это сделать в bash?

27
задан Arnaud Le Blanc 11 September 2011 в 18:54
поделиться

3 ответа

Существуют и другие решения, но я обычно использую простое, чтобы поместить вывод wc во временный файл, а затем прочитать оттуда:

wc file.txt > xxx
read lines words characters filename < xxx 
echo "lines=$lines words=$words characters=$characters filename=$filename"
lines=2 words=5 characters=23 filename=file.txt

Преимущество этого метода что вам не нужно создавать несколько awk процессов, по одному для каждой переменной. Недостатком является то, что вам нужен временный файл, который вы должны удалить позже.

Будьте осторожны: это не работает:

wc file.txt | read lines words characters filename

Проблема в том, что передача в read создает другой процесс, и переменные там обновляются, поэтому они не доступны в вызывающей оболочке.

Редактировать: добавление решения по arnaud576875:

read lines words chars filename <<< $(wc x)

Работает без записи в файл (и не имеет проблем с конвейером). Это специфично для Bash.

Из руководства по bash:

Here Strings

   A variant of here documents, the format is:

          <<<word

   The word is expanded and supplied to the command on its standard input.

Ключ - это бит «слово расширено».

13
ответ дан 28 November 2019 в 04:42
поделиться
declare -a result
result=( $(wc < file.txt) )
lines=${result[0]}
words=${result[1]}
characters=${result[2]}
echo "Lines: $lines, Words: $words, Characters: $characters"
0
ответ дан 28 November 2019 в 04:42
поделиться

Просто добавить еще один вариант -

set -- `wc file.txt`
chars=$1
words=$2
lines=$3

Это, очевидно, забивает $* и связанных с ним переменных. В отличие от некоторых других решений здесь, он переносим на другие оболочки Борна.

4
ответ дан 28 November 2019 в 04:42
поделиться