使用 AWK,如果列中的字符串以特定字符串开头,则打印 $1(第一列)?

Using AWK, print $1 (First column) if the string in the column starts with a specific string?

首先我想说我知道 Whosebug 上有很多关于 AWK 和正则表达式的问题。我已经尝试搜索不同的问题和答案,测试了多个答案并且 none 有效。

我有一个由命令生成的列表:

iostat -dx | awk ' { print  }'

输出如下:

extended
device
ada0
ada1
ada2
pass0
pass1
pass2

我只想输出以ada开头的行... ada0, ada1, ada2.

以下是我试过的一些命令,它们都没有输出:

iostat -dx | awk '( == "^ada") { print  }'
iostat -dx | awk '( == "/^ada.*$/") { print  }'

这个输出 device (??):

iostat -dx | awk '( ~ /^d[ada]*/ ) { print  }'

重要提示:我不能为此使用 grep,因为这是在没有 GREP,只有 AWK 的 Docker 图像上运行的。我非常了解命令“iostat -x | grep "ada" | awk '{print $1}'”,但不幸的是我不能使用它。

正则表达式应该只是 ^ada,就像您第一次尝试的那样。但是正则表达式应该在 // 里面,而不是引号,你必须使用 ~ 来比较它。

iostat -dx | awk ' ~ /^ada/ { print  }'

I am very much aware of the command "iostat -x | grep "ada" | awk '{print }'", but unfortunatelly I can not use that.

只需用上面的 awk 替换 grep "ada" 即可得到

iostat -x | awk '/ada/' | awk '{print }'

可以更简洁地写成

iostat -x | awk '/ada/{print }'

请注意,这将在任何地方打印所有包含 ada 的行,就像您使用 grep 显示的那样。

作为旁注,如果 grep 被禁止,您可以使用如上所示的 awk 或使用 sed 替换简单的 grep 命令,如下所示

iostat -x | sed -n '/ada/p' | awk '{print }'

-n 确实关闭默认打印,/ada/p 表示如果行包含 ada 则打印它

更新 2:测试所有 awk 变体我必须说明解决方案的可移植性:

% cat iostat.txt | gawk -te 'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | gawk -ce 'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | gawk -Sbe 'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | gawk -ne 'NF=/^ada/' 
ada0
ada1
ada2
ada2
% cat iostat.txt | gawk -Pe 'NF=/^ada/' 
ada0
ada1
ada2
% cat iostat.txt | gawk -e 'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | mawk  'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | mawk2  'NF=/^ada/'
ada0
ada1
ada2
% cat iostat.txt | nawk  'NF=/^ada/'
ada0
ada1
ada2

更新:刚刚意识到可以非常简洁:

iostat -x | mawk 'NF=/^ada/'

ada0
ada1
ada2

或者让它更简单:

iostat -x \
           \
           | mawk '!_<NF' FS='^ada'

ada0
ada1
ada2

如果您想跳过 shell 引用部分:

mawk2 -F^ada NF==2 
mawk2        NF==2 FS=^ada

还有更奇特的方法:

mawk '$_!=$NF' FS='^ada[0-9]+'

ada0
ada1
ada2

mawk '_~$NF' FS='^ada[0-9]+'

ada0
ada1
ada2

如果您更喜欢 gnu-gawk,那么这是 RT 存在的一个很好的例子:

gawk -e '$_=RT' RS='ada[0-9]+'

ada0
ada1
ada2

如果您真的喜欢使用非常规的方法,这些方法近乎 counter-intuitive 和不合逻辑:

mawk     '$NF<"<"'  FS='^ada[0-9]+'
mawk     '$NF<=">"' FS='^ada[0-9]+'
mawk  '!_!~NF'      FS='^ada[0-9]+'
mawk '_~_!~NF'      FS='^ada[0-9]+'

ada0
ada1
ada2