仅打印第二个字段符合某些条件的行

yae*_*ael 37 awk sed

我有

1 LINUX param1 value1 
2 LINUXparam2 value2
3 SOLARIS param3 value3
4 SOLARIS param4 value4
Run Code Online (Sandbox Code Playgroud)

我需要在awk打印所有行中$2LINUX.

Han*_*Gay 72

awk:

awk '$2 == "LINUX" { print $0 }' test.txt
Run Code Online (Sandbox Code Playgroud)

有关详细介绍,请参阅awk示例awk.

sed:

sed -n -e '/^[0-9][0-9]* LINUX/p' test.txt
Run Code Online (Sandbox Code Playgroud)

有关详细介绍,请参阅sed示例sed.

  • 请注意,默认操作已经是'print $ 0`,所以这就是所需要的:`awk'tapepper($ 2)=="LINUX"'test.txt` (10认同)
  • @HankGay“awk by example”URL 不再有效。 (2认同)

fed*_*qui 11

在这种情况下,您可以使用美丽的惯用语awk:

awk '$2=="LINUX"' file
Run Code Online (Sandbox Code Playgroud)

那是:

  • awk处于True条件时的默认操作是打印当前行.
  • 因为$2 == "LINUX"每当第二个字段是LINUX时都是如此,这将打印出现这种情况的那些行.

如果您要打印所有匹配的行,LINUX无论它们是大写还是小写,请使用toupper()以将它们全部大写:

awk 'toupper($2)=="LINUX"' file
Run Code Online (Sandbox Code Playgroud)

或者IGNORECASE使用以下任一语法:

awk 'BEGIN {IGNORECASE=1} $2=="LINUX"' file
awk -v IGNORECASE=1 '$2=="LINUX"' file
Run Code Online (Sandbox Code Playgroud)


小智 8

我的回答很晚了,但没有人提到:

awk '$2~/LINUX/' file
Run Code Online (Sandbox Code Playgroud)

  • @enegue,为什么我应该使用正则表达式来进行精确匹配?此外,如果我想匹配特殊字符,正则表达式会更加阻碍。不要尝试使用锤子代替螺丝刀,反之亦然。 (2认同)

B J*_*son 6

试试这些:

egrep -i '^\w+ LINUX ' myfile

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

sed -ne '/^[0-9]* [Ll][Ii][Nn][Uu][Xx] /p' myfile
Run Code Online (Sandbox Code Playgroud)

编辑:修改为不区分大小写


Ars*_*yan 5

awk我认为使用))包含“精确”和“部分匹配”案例可能是个好主意

因此,为了精确匹配

OTHER_SHELL_COMMAND | awk '$2 == "LINUX" { print $0 }'
Run Code Online (Sandbox Code Playgroud)

对于部分匹配

OTHER_SHELL_COMMAND | awk '$2 ~ /LINUX/ { print $0 }'
Run Code Online (Sandbox Code Playgroud)