Как вычесть строки (строки) с AWK

Ответ покрытиями 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.

9
02.03.2014, 23:40
3 ответа

Вы также можете сделать это с помощью 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
9
27.01.2020, 20:05
[116791]чисто awk решение, без лишних команд cat или grep:[12221]awk '/MemTotal/ {TOT=$2} /Бесплатно/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo[12222]Я вижу, что awk_FTW меня опередил, но я думал, что форматирование вывода может быть хорошим.[116796].
3
27.01.2020, 20:05

Попробуйте так:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
3
27.01.2020, 20:05

Теги

Похожие вопросы