如何使用 awk 跳过行

phe*_*phe 8 bash awk

我有一个这样的命令:

tac $log | awk -v pattern="test" '$9 ~ pattern {print; exit}'
Run Code Online (Sandbox Code Playgroud)

$9它向我显示了包含文本的最后一行test

像这样:

Thu Mar 26 20:21:38 2015 1 10.8.0.22 94 /home/xxxyyy/zzz_test_223123.txt b _ o r spy ftp 0 * c
Thu Mar 26 20:21:39 2015 1 10.8.0.22 94 /home/SAVED/zzz_test_123123.txt b _ o r spy ftp 0 * c
Thu Mar 26 20:21:40 2015 1 10.8.0.22 94 /home/xxxyyy/zzz_test_123123.txt b _ o r spy ftp 0 * c
Thu Mar 26 20:21:41 2015 1 10.8.0.22 94 /home/SAVED/zzz_test_123124.txt b _ o r spy ftp 0 * c
Run Code Online (Sandbox Code Playgroud)

-->

Thu Mar 26 20:21:41 2015 1 10.8.0.22 94 /home/SAVED/zzz_test_123124.txt b _ o r spy ftp 0 * c
Run Code Online (Sandbox Code Playgroud)

该命令显示了最后一行。但如果线路有的话我需要通过SAVED。所以我需要这样显示:

Thu Mar 26 20:21:40 2015 1 10.8.0.22 94 /home/xxxyyy/zzz_test_123123.txt b _ o r spy ftp 0 * c
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mar*_*rot 10

要跳过一行,您可以匹配它,然后使用该next命令。

$9 ~ /SAVED/ { next }
$9 ~ /\.txt$/ { print; exit }
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 4

您可以添加另一个条件!~来防止第二个模式匹配(我用pattern2它来使其更通用,当然您可以SAVED在那里进行硬编码):

$9 ~ pattern && $9 !~ pattern2
Run Code Online (Sandbox Code Playgroud)

全部一起:

$ awk -v pattern="test" -v pattern2="SAVED" '$9 ~ pattern && $9 !~ pattern2 {print; exit}'
Thu Mar 26 20:21:40 2015 1 10.8.0.22 94 /home/xxxyyy/zzz_test_123123.txt b _ o r spy ftp 0 * c
Run Code Online (Sandbox Code Playgroud)