2013-03-11 240 views
18

我有一堆文档,它们在不同位置都有行Account number: 123456789使用awk在分隔符后仅查找字符串的第一个匹配项

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

例如,如果它是:

Account number: 1234567 

awk应该返回:

1234567 

一旦它找到的第一次出现可以停止寻找。

但是,我很难过。使用awk做正确的方法是什么?

回答

30

方式一:

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

我假设你想阻止你查找文件中第一次出现的时刻。如果您想在文件的每一行中查找出现的内容,只需删除exit即可。

5

您可以使用if来检查$1$2是否等于“Account”和“number:”。如果他们这样做,然后打印$3

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

我究竟该怎么做? – DrDavid 2013-03-11 04:39:06

+0

添加示例.. – 2013-03-11 04:39:56

+1

为什么多加'{}'?为什么不只是'awk'$ 1 ==“Account”&& $ 2 ==“number:”{print $ 3;退出}'input.txt'? – tianon 2014-02-06 00:48:28

0

你也使用sed -n s///p

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

对于这样的匹配问题我更喜欢使用grep与向后看:

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

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

这是说:打印任何序列出现在字符串后面的数字(\d+)。

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


看到它在行动给出一个文件file

Account number: 1234567 
but then another Account number: 789 
and that's all 

让我们看看输出的样子:

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