Bash awk:在读取行之前打印文件的第一行

Bash awk:在读取行之前打印文件的第一行,bash,awk,Bash,Awk,在开始使用awk逐行打印每一行之前,我将如何打印给定输入的第一行 假设我想运行命令ps aux,并返回我正在搜索的列标题和特定模式。过去我曾这样做过: ps aux | ggrep -Pi 'CPU|foo' 其中,CPU是一个值,我知道它将位于输入的第一行,因为它是列标题之一,foo是我实际搜索的特定模式 我发现了一个awk模式,它将拉动第一条线: awk 'NR > 1 { exit }; 1' 这是有道理的,但在对其余的输入进行模式匹配之前,我似乎不知道如何启动它。我想我可以把

在开始使用awk逐行打印每一行之前,我将如何打印给定输入的第一行

假设我想运行命令
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
子句。你能详细说明一下吗?(似乎我遗漏了什么)我现在引用了触发这种反应的短语。这就是这个问题的全部内容。你的回答涉及核心问题。