使用 awk 匹配单个文件中的多个正则表达式

使用 awk 匹配单个文件中的多个正则表达式

我正在尝试使用 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将匹配并打印包含单词的行并打印紧随其后的行。

相关内容