使用awk查找分隔符后第一次出现的字符串

时间:2013-03-11 04:34:42

标签: bash awk

我有很多文件都在各个地方都有Account number: 123456789行。

我需要做的是能够解析文件,并找到帐号本身。因此,awk需要查找Account number:并紧接着返回字符串。

例如,如果是:

Account number: 1234567

awk应该返回:

1234567

一旦发现第一次出现,它就会停止查看。

但是,我很难过。使用awk

执行此操作的正确方法是什么?

5 个答案:

答案 0 :(得分:39)

一种方式:

awk -F: '$1=="Account number"{print $2;exit;}' file

我假设您想要在文件中找到第一个出现的那一刻停止。如果要在文件的每一行中查找事件,只需删除exit

答案 1 :(得分:6)

您可以使用if检查$1$2是否等于“帐户”和“数字:”。如果有,请打印$3

> awk '{if ($1 == "Account" && $2 == "number:") {print $3; exit;}}' input.txt

答案 2 :(得分:3)

对于这样的匹配,我更喜欢使用grep与后视:

grep -Po '(?<=Account number: )\d+' file

grep -Po 'Account number: \K\d+' file

这表示:打印字符串\d+后出现的任何数字序列(Account number:)。

在第二种情况下,\K清除匹配的字符串,以便在\K之后开始打印。

在给定文件file

的情况下查看它
Account number: 1234567
but then another Account number: 789
and that's all

让我们看看输出结果如何:

$ grep -Po '(?<=Account number: )\d+' file
1234567
789

答案 3 :(得分:1)

您也可以使用sed -n s///p

sed -En 's/^Account number: (.+)/\1/p' *.txt | head -n1

答案 4 :(得分:1)

被接受的答案在字符串前面输出一个空格,这迫使我使用另一种方法:

awk '/Account number/{print $3; exit}'

此解决方案忽略了:分隔符,但它就像一个超级按钮,并且更容易记住IMO。