我正在尝试检索 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
命令的输出。
答案 0 :(得分:1)
顺便说一句-大多数情况下,当您在一个命令中使用grep和awk时,这是错误的;)
awk '
{
if ($0~/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/) {
c++
l=$0
if(c==1){print}
}
}
END{print l}
' $LOG
答案 1 :(得分:0)
使用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
命令对其进行解析:
$ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z' | awk 'NR == 1 { print $2; } END { print $2; }'
a
e
答案 2 :(得分:0)
@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