使用 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
首先我想说我知道 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