Bash awk:在读取行之前打印文件的第一行
在开始使用awk逐行打印每一行之前,我将如何打印给定输入的第一行 假设我想运行命令Bash awk:在读取行之前打印文件的第一行,bash,awk,Bash,Awk,在开始使用awk逐行打印每一行之前,我将如何打印给定输入的第一行 假设我想运行命令ps aux,并返回我正在搜索的列标题和特定模式。过去我曾这样做过: ps aux | ggrep -Pi 'CPU|foo' 其中,CPU是一个值,我知道它将位于输入的第一行,因为它是列标题之一,foo是我实际搜索的特定模式 我发现了一个awk模式,它将拉动第一条线: awk 'NR > 1 { exit }; 1' 这是有道理的,但在对其余的输入进行模式匹配之前,我似乎不知道如何启动它。我想我可以把
ps aux
,并返回我正在搜索的列标题和特定模式。过去我曾这样做过:
ps aux | ggrep -Pi 'CPU|foo'
其中,CPU
是一个值,我知道它将位于输入的第一行,因为它是列标题之一,foo
是我实际搜索的特定模式
我发现了一个awk模式,它将拉动第一条线:
awk 'NR > 1 { exit }; 1'
这是有道理的,但在对其余的输入进行模式匹配之前,我似乎不知道如何启动它。我想我可以把它放在awk命令的BEGIN
部分,但这似乎不起作用
有什么建议吗?使用以下awk脚本:
ps aux | awk 'NR == 1 || /PATTERN/'
如果当前行是输出中的第一行或包含模式,则打印当前行
顺便说一句,使用sed
可以获得相同的结果:
ps aux | sed -n '1p;/PATTERN/p'
解释awk
开始
我想我可以把它放在开始部分
在
awk
中,可以有多个BEGIN
子句。在awk开始从stdin
读取之前,这些命令按顺序执行。如果要读取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
格雷普错了吗?这项任务比awk任务更有意义。我不明白你想要什么。如果awk读取了您的第1行,则它已经开始读取您的文件。@hek2mgl,我在进行grepping时遇到的问题是,我用于匹配的列标题恰好位于除第一行之外的一些输出中,例如,如果我对
PID
进行grep以获取标题,有时如果我使用-I
标志进行grep,则返回带有模式PID
的流程行。同时,我也在努力学习更多关于awk的知识@Kent,我想要的是来自awk的输出,它总是包含第一行,然后还包含与我匹配的模式匹配的其余行。简单的解决方案。我想你可以去掉这两个*
——它们只是增加了混乱。谢谢@hek2mgl,这正是我想要的。@HenkLangeveld是的,这真的是不必要的杂乱。感谢您指出这一点,我不明白您为什么在本例中提到BEGIN
子句。你能详细说明一下吗?(似乎我遗漏了什么)我现在引用了触发这种反应的短语。这就是这个问题的全部内容。你的回答涉及核心问题。