我想使用grep
,awk
或sed
在匹配模式后提取第N行。
例如我有这段文字:
Revision:
60000<br />
我想提取60000。
我尝试Revision:([a-z0-9]*)\s*([0-9]){5}
与修订号一起匹配修订号,但是当我将它传递给grep:grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html
时,我什么都没得到。
我怎样才能做到这一点?
答案 0 :(得分:17)
要extract the Nth line after a matching pattern
你想要:
awk 'c&&!--c;/pattern/{c=N}' file
e.g。
awk 'c&&!--c;/Revision:/{c=5}' file
将在文本“Revision:”/。
之后打印第5行仅供参考以下习语描述如何在给定特定模式匹配的情况下选择一系列记录:
a)打印某些模式的所有记录:
awk '/pattern/{f=1}f' file
b)在某种模式之后打印所有记录:
awk 'f;/pattern/{f=1}' file
c)在某种模式后打印第N条记录:
awk 'c&&!--c;/pattern/{c=N}' file
d)在某种模式之后打印除第N条记录以外的所有记录:
awk 'c&&!--c{next}/pattern/{c=N}1' file
e)在某种模式之后打印N条记录:
awk 'c&&c--;/pattern/{c=N}' file
f)在某种模式之后打印除N条记录之外的所有记录:
awk 'c&&c--{next}/pattern/{c=N}1' file
g)从某种模式打印N条记录:
awk '/pattern/{c=N}c&&c--' file
我将变量名称从“f”变为“found”变为“c”变为“count”,因为它更能表达变量实际上是什么。
答案 1 :(得分:2)
在第一个空白/空行之后打印第SELECT *, CONCAT(Addr1, ',', Addr2, ',',Addr3) AS Address FROM customer;
th 行:
要打印的行的索引(在bash shell中):
lnb
使用lnb=2
:
sed
使用sed -ne '/^\s*$/{:a;n;0~'"$lnb"'!ba;p;q}' my_file`
:
perl
在常规表达式匹配后打印第perl -ne '/^\s+$/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file`
行:
使用lnb
:
sed
使用sed -ne '/regex/{:a;n;0~'"$lnb"'!ba;p;q}' my_file
:
perl
Bonus 1,Windows PowerShell (首先安装Perl):
perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file
Bonus 2,Windows DOS命令行:
$lnb=2
perl -ne "/regex/ && `$k++;`$k!=0 && `$k++ && `$k==$lnb+2 && (print,last)" my_file
在正则表达式匹配后打印全部set lnb=2
perl -ne "/regex/ && $k++;$k!=0 && $k++ && $k==%lnb%+2 && (print,last)" my_file
th 行:
使用lnb
(bash示例):
perl
答案 2 :(得分:0)
我喜欢可以重做的解决方案,而不必每次都用Google搜索。这种解决方案并不完美,但是使用了我可以从内存中写入的简单grep命令。
grep -A7 "searchpattern" file | grep -B1 "^--$" | grep -v "^--$"
您可以在搜索模式之后将7更改为所需的第n行。然后,它搜索“组分隔符” --
,并显示之前的最后一行。然后删除组分隔符。
唯一无法正常工作的情况是,如果您的数据包含仅包含“-”的行。