A GNU awk
решение:
awk -F'\\]|\\[' 'tolower($3)~/"out.stdout_lines" *:/ && tolower($4)~/"kernel/{print "The IP " $2 " cointain Kernel"}' RS='}' file
Выход:
The IP 10.9.22.122 cointain Kernel
The IP 10.9.44.124 cointain Kernel
The IP 10.9.22.28 cointain Kernel
The IP 10.9.22.33 cointain Kernel
Я использовал ]
или [
в качестве FS
разделителя полей, а }
в качествеRS
разделитель записей.
Таким образом, IP просто становится $2
.
Это решение зависит от структуры, это означает, что "out.stdout_lines"
должен быть в поле после [ip]
, как вы показали в своем примере.
Другой способ GNU awk, без ограничений:
awk -F']' 'match(tolower($0),/"out\.stdout_lines": *\[([^\]]+)/,m){if(m[1]~/"kernel/)print "The IP " substr($1, index($1,"[")+1) " cointain Kernel"}' RS='}' file
Тот же вывод.tolower
s для сопоставления без учета регистра. Если вы хотите точное совпадение, вы можете удалить их или просто использовать решения из Revision 6 .
Объедините достоинства сверху двумя способами, Третий способ :
awk -F'\\]|\\[' 'match(tolower($0),/"out\.stdout_lines": *\[([^\]]+)/,m){if(m[1]~/"kernel/)print "The IP " $2 " cointain Kernel"}' RS='}' file
Измените tolower($0)
на $0
, если вам не нужно регистронезависимое совпадение.