用于检索第一行和最后一行的Linux awk命令

用于检索第一行和最后一行的Linux awk命令,linux,awk,Linux,Awk,我正在尝试检索awk命令的第一行和最后一行,但无法检索。我犯错误的地方 egrep 'updateAll|update-mgr|Startup REX|configd.*UnitProperty updated' $LOG | \ awk 'NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}' awk: cmd. line:2: NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2

我正在尝试检索awk命令的第一行和最后一行,但无法检索。我犯错误的地方

egrep 'updateAll|update-mgr|Startup REX|configd.*UnitProperty updated' $LOG | \
  awk 'NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}'

awk: cmd. line:2: NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}
awk: cmd. line:2:                                    ^ syntax error

我希望第一行和最后一行是grep命令的输出。

顺便说一句-大多数情况下,当您在一个命令中使用grep&awk时,您的操作是错误的

awk '
{  
    if ($0~/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/) {
       c++
       l=$0
       if(c==1){print}       
    }
}
END{print l}
'  $LOG
使用NR==1获取第一行,使用END获取最后一行

有此输入:

$ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z'
1 a v
2 b w
3 c x
4 d y
5 e z
我们可以使用以下awk命令对其进行解析:


@tink的解决方案是正确的。我只想补充一点:

使用变量l是一种不好的做法,因为根据当前字体的不同,它可能被误认为是1或I

默认匹配模式可以提取为用于记录处理的过滤模式

因此@tink解决方案变成:

awk '
/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/ {  
    c++;
    lastLine = $0;
    if(c == 1){print}       
}
END{print lastLine}
'  $LOG
$在awk中没有意义。。。如果它理解巴什主义,它仍然不会做你想做的事。
awk '
/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/ {  
    c++;
    lastLine = $0;
    if(c == 1){print}       
}
END{print lastLine}
'  $LOG