我正在尝试使用 shell 脚本解析 HTML 文件。
我需要捕获 4 个不同的正则表达式:name=
, age=
, class=
, marks=
。
使用
grep "name=\|age=\|class=\|marks=" student.txt
我能够获得所需的行,但是除了这些匹配行之外,我还需要打印每场比赛中包含分数的第二行。
参考问题:打印匹配行和匹配行中的第 n 行。
我将代码修改为:
awk '/name=\|age=\|class=\|marks=/{nr[NR]; nr[NR+2]}; NR in nr' student.txt
但这似乎不起作用。如何在同一命令中搜索多个正则表达式awk
?
答案1
尝试使用:
awk '/foo/||/bar/' Input.txt
答案2
awk
正则表达式是扩展正则表达式,而grep
没有的则-E
是基本正则表达式。使用扩展正则表达式:
awk '/name=|age=|class=|marks=/{nr[NR]; nr[NR+2]}; NR in nr'
请注意,标准基本正则表达式会不是有一个交替运算符,所以
grep 'a\|b'
通常不会在所有情况下工作grep
(虽然有一些像 GNUgrep
支持它作为扩展)。
grep -E 'a|b'
grep -e a -e b
grep 'a
b'
无论如何都会起作用grep
。
答案3
使用 grep
如果您使用 grep ( ) 的 after 上下文切换-A
并指定 a1
来获取匹配后的第一行,会怎么样?
$ grep -E -A 1 "name=|age=|class=|marks=" student.txt
例子
样本文件。
$ cat student.txt
name=
1st line after name
2nd line after name
age=
1st line after age
2nd line after age
class=
1st line after class
2nd line after class
marks=
1st line after marks
2nd line after marks
那么当你执行上面的命令时:
$ grep -E -A 1 "name=|age=|class=|marks=" student.txt
name=
1st line after name
--
age=
1st line after age
--
class=
1st line after class
--
marks=
1st line after marks
使用 awk
正如 @RahulPatil 建议使用该构造awk
:
'/string1/||/string2/||...'
像这样的东西就可以满足您的需求。
$ awk '
/name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr
' student.txt
例子
$ awk '
/name=/||/age=/||/class=/||/marks=/{nr[NR]; nr[NR+1]}; NR in nr
' student.txt
name=
1st line after name
age=
1st line after age
class=
1st line after class
marks=
1st line after marks
答案4
您是否尝试过在 grep 中使用“-A”标志?它将打印匹配后的尾随上下文行。例如:grep -A1 foo file.txt
将匹配并打印包含单词的行富并打印紧随其后的行。