awk: Сохранить форматирование вывода при замене поля

Более надежный способ сawkскриптом:

awk '{ if (/foo/) gsub(/foo/, "bar"); else $0 = $0 "baz" }1' file

Или даже короче:

awk '{ if (!gsub(/foo/, "bar")) $0 = $0 "baz"; }1' file
2
21.06.2020, 16:41
2 ответа

При использовании функции gsub для изменения содержимого $0 (без замены определенного поля )вывод не будет переформатирован:

df -h | awk '$5 ~ /[8-9][0-9]|100/ {gsub($5,"\033[1;31m"$5"\033[0m")}1'

Это работает только в том случае, если $5 встречается только один раз в строке с предположительно имеет место в данном примере.

2
18.03.2021, 23:26

GNU awk имеет расширение для разделения ():, оно будет хранить все поля в одном массиве, а все фактические разделители полей (, совпадающие с используемым RE ), в другом массиве. Таким образом, вы можете исправить значение [5], чтобы включить окраску, а затем воссоздать выходную строку в цикле, чередуя поля и фактические разделители.

https://www.gnu.org/software/gawk/manual/gawk.html#String-Functionsи прокрутите вниз до split()

.
-1
18.03.2021, 23:26

Теги

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