awk“if”语句

Gra*_*man 4 awk

我有一个文件

foo
--
bar
Run Code Online (Sandbox Code Playgroud)

我只想要分隔符上方的线。我已经为此苦苦挣扎了太久,并尝试了多种变体。我的一班班轮是:

echo -e "foo\n-- \nbar" | gawk -v x=0 -- '/^--\ / { x++ } ; IF (x==0) {print} '
Run Code Online (Sandbox Code Playgroud)

这应该只打印“foo”,但我得到了整个文件输出。如果我更改为 print x 我得到

0
1
1
Run Code Online (Sandbox Code Playgroud)

我似乎无法让 make awk 根据 x 的值有条件地打印一行。我知道我错过了一些简单的事情。

Gil*_*not 5

尝试这样做:

echo -e "foo\n-- \nbar" | awk '/^--/{exit}1'
Run Code Online (Sandbox Code Playgroud)

说明

  • /^--/是一个正则表达式,用于匹配当前行开头的字符串
  • {}如果条件为(之前的正则表达式),则执行部分
  • 1就像{print}:默认情况下,awk如果条件为true则在 STDOUT 上打印。对于 awk来说1也是如此,它打印当前行。

命令分解:

echo -e "foo\n-- \nbar" | awk '
    {
        if (/^--/) {
            exit
        }
        else {
            print
        }
    }
'
Run Code Online (Sandbox Code Playgroud)

替代分解:

echo -e "foo\n-- \nbar" |
awk '(/^--/) { exit }
             { print }'
Run Code Online (Sandbox Code Playgroud)

这强调了有两个模式动作规则;具有明确模式和退出动作的一个;另一个具有隐式图案和打印操作。