在我开始使用awk逐步浏览每一行之前,如何打印给定输入的第一行?
说我想运行命令ps aux
并返回列标题和我正在搜索的特定模式。过去我做过这个:
ps aux | ggrep -Pi 'CPU|foo'
CPU
是一个值,我知道它将在输入的第一行,因为它是列标题之一,foo
是我实际搜索的特定模式。
我找到了一个将拉出第一行的awk模式:
awk 'NR > 1 { exit }; 1'
这是有道理的,但在我对其余输入进行模式匹配之前,我似乎无法弄清楚如何解决这个问题。我以为我可以把它放在awk命令的BEGIN
部分,但这似乎不起作用。
有什么建议吗?
答案 0 :(得分:11)
使用以下awk脚本:
ps aux | awk 'NR == 1 || /PATTERN/'
如果它是输出中的第一行或者包含模式,它会打印当前行。
顺便说一句,使用sed
:
ps aux | sed -n '1p;/PATTERN/p'
答案 1 :(得分:2)
解释awk BEGIN
我以为我可以把它放在BEGIN部分......
在awk
中,您可以拥有多个BEGIN
子句。在 awk开始从stdin
开始读取之前,按顺序执行 。
答案 2 :(得分:0)
如果您想在BEGIN
操作的第一行中进行读取,则可以使用getline
对其进行读取,处理并丢弃该行,然后再继续执行awk命令的其余部分。这是“介入”,但如果您首先解析标头或其他内容,则可能会有所帮助。
#input.txt
Name City
Megan Detroit
Jackson Phoenix
Pablo Charlotte
awk 'BEGIN { getline; col1=$1; col2=$2; } { print col1, $1; print col2, $2 }' input.txt
# output
Name Megan
City Detroit
Name Jackson
City Phoenix
Name Pablo
City Charlotte