Ответ покрытиями StephaneChazelas grep(1)
, и большинство команд происхождения Unix прокладывает себе путь, но не все. Это стандартно для чтения любого из стандартного входа (с клавиатуры, из файла, перенаправленного через < file
, или от вывода, переданного по каналу другой командой, глупым примером ls * | grep '^ab*c$'
), или из файла (файлов), данного как аргументы, как grep comment file1 file2 file3
. Некоторые команды используют конвенцию там, которую назвал файл -
стандартный вход, таким образом, можно сказать make-middle | cat head - tail
получить поток с head
, безотносительно gen-middle
генерирует, сопровождаемый tail
. Это дизайном, для предоставления гибкости в использовании команд.
Который лучше? Пока это работает, cmd file
короче, чем cmd < file
; могла быть крошечная разница во времени между оболочкой, делающей файл frobbing (<
) и команда, делающая его отдельно, но вероятно непримечательный, если Вы целый день не делаете ничего иного. Это будет зависеть от соображений как профессионалы, упомянутые в ответе Stephane.
Вы также можете сделать это с помощью awk
, paste
и bc
. Я нахожу этот подход более легким для запоминания, синтаксис awk
всегда требует поиска информации для подтверждения.
ПРИМЕЧАНИЕ: Преимущество этого подхода в том, что можно работать с несколькими строками вывода, вычитая 2-е, 3-е, 4-е и т.д. числа из 1-го.
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}' | paste -sd- - | bc
7513404
В приведенном выше примере используется awk
для выбора столбца, содержащего числа, которые мы хотим вычесть.
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'
7969084
408432
Затем мы используем paste
, чтобы объединить эти 2 значения и добавить знак минус между ними.
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'| paste -sd- -
7969084-346660
Когда мы передаем это в bc
, он выполняет вычисление.
$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk '{print $2}'| paste -sd- - | bc
7513404
Попробуйте так:
grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'