我需要获取文件某个行号之前与模式匹配的一行。
例子:
linenum 1.fruits
linenum 2.cherry
linenum 3.apple
.
.
linenum 7.orange
linenum 8.apple2
.
.
.
linenum 20.strawberry
从上面的文件中,我想要第 8 行。我知道它会出现在第 20 行之上,并且我知道该行包含apple
。
答案1
这是一个使用的解决方案sed
:
sed -n '20,$d;/apple/h;19{x;p}'
-n
- 禁止打印线条20,$d
20
- 对于从到文件末尾 ( )的任何行$
,删除 (d
) 它/apple/h
- 对于与正则表达式匹配的任何行/apple/
,将其复制到“保持空间“(h
)19{x;p}
- 在线19
,交换模式并保持空间(x
)并打印模式空间(p
)
19
请注意,最终打印时必须使用 line ,因为此后的所有行都将被删除。否则,您可以使用“最后一行“ 地址 - $
。
在这个测试中,我在第 23 行添加了一个apple
。
$ sed -n '20,$d;/apple/h;19{x;p}' < file
linenum 8.apple2
答案2
尽管标签是sed,我的答案没有用sed
。
以下命令获取前 19 行,丢弃没有 的行apple
,然后返回剩余的最后一行:
head -n 19 | grep "apple" | tail -n 1
要处理名为的文件file.txt
:
<file.txt head -n 19 | grep "apple" | tail -n 1
答案3
与已经发布的解决方案相同,这次使用 Perl:
perl -lane 'if(1..19 and /apple/){$a=$_} END{print $a}' input.txt
和 AWK:
awk 'NR<20 && /apple/ {a=$0} END{print a}' input.txt