如何根据其模式从文件返回特定的文本?



我有一个有几行的文件,想从中输出一个单词。例如

bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf

在这个文件中,我只想输出单词0xksjdflksjflksjf。我正在考虑一个命令,它将查找以WORD1开头的行,然后在该行中查找以0x开头的单词。

我很确定awksed会允许我这样做。我找到了一种方法,但它不是很"干净";

awk '/^WORD1/ {print $5}'

它可以工作,但是有没有更好的方法(例如基于单词模式而不是它在行的位置)来做到这一点?

如果您有一个名为0x.txt的文件,其中包含以下内容:

bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf
bla bla bla bla
WORD1 bla 0xksjdflksjflks ldskjf sldfkj

:

awk '/^WORD1/ {for (i=1;i<=NF;i++) if ( match($i, /^0x/) ) print $i}' 0x.txt

将打印不依赖于列号的所需内容:

0xksjdflksjflksjf
0xksjdflksjflks

sed版本(使用GNU sed):

输入文件

cat file
bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf

命令执行:

sed -nr /^WORD1/{'s/^(WORD1.+)(0xw+)(.*$)/2/p}' file
0xksjdflksjflksjf

抑制正常输出(-n),找到以WORD1开头的行,用空替换0x之前的所有内容,然后打印该行。

我喜欢@AlexZhu的答案,但作为一种替代方案,无需使用match()1迭代到NF,然后使用match()substr()设置的RSTARTRLENGTH内置变量,例如,使用@AlexZhu提供的相同输入文件,您将拥有:

awk '
/^WORD1/ {
match($0,/[ ]0x[^ ]+/)
if (RLENGTH > -1)
print substr ($0, RSTART+1, RLENGTH)
}
' file
0xksjdflksjflksjf
0xksjdflksjflks

每个函数的文档都包含在GNU Awk用户指南中。

相关内容

  • 没有找到相关文章

最新更新