Печатать только те строки, где второе поле соответствует некоторым критериям - PullRequest
35 голосов
/ 02 июня 2010

у меня

1 LINUX param1 value1 
2 LINUXparam2 value2
3 SOLARIS param3 value3
4 SOLARIS param4 value4

Мне нужен awk для печати всех строк, в которых $2 равно LINUX.

Ответы [ 4 ]

67 голосов
/ 02 июня 2010

In awk:

awk '$2 == "LINUX" { print $0 }' test.txt

См. awk на примере для хорошего вступления к awk.

In sed:

sed -n -e '/^[0-9][0-9]* LINUX/p' test.txt

См. sed на примере для хорошего вступления к sed.

8 голосов
/ 24 ноября 2015

Это тот случай, когда вы можете использовать красивый идиоматический awk:

awk '$2=="LINUX"' file

То есть:

  • Действие по умолчанию awk в режиме True - печать текущей строки.
  • Так как $2 == "LINUX" истинно, когда 2-е поле имеет значение LINUX, будут напечатаны те строки, в которых это происходит.

В случае, если вы хотите напечатать все эти строки, соответствующие LINUX, независимо от того, заглавные или строчные, используйте toupper(), чтобы прописать их все:

awk 'toupper($2)=="LINUX"' file

или IGNORECASE с любым из следующих синтаксисов:

awk 'BEGIN {IGNORECASE=1} $2=="LINUX"' file
awk -v IGNORECASE=1 '$2=="LINUX"' file
4 голосов
/ 02 июня 2010

Попробуйте это:

egrep -i '^\w+ LINUX ' myfile

awk '{IGNORECASE=1}{if ($2 == "LINUX") print}' myfile

sed -ne '/^[0-9]* [Ll][Ii][Nn][Uu][Xx] /p' myfile

edit: модифицировано для нечувствительности к регистру

3 голосов
/ 02 июня 2010

В GNU sed совпадения без учета регистра могут быть выполнены с использованием модификатора I:

sed -n '/^[^[:space:]][[:space:]]\+linux[[:space:]]\+/Ip'

Будет надежно соответствовать "linux", "Linux", "LINUX", "LiNuX" и другим как второе поле (после первого поля, которое может быть любым непробельным символом) и окружено любое количество (хотя бы один) любого пробела (в первую очередь, пробел и табуляция, хотя вы можете использовать [:blank:], чтобы ограничить его только этими). ​​

...