38

我有一堆文件,Account number: 123456789在不同的位置都有一行。

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

例如,如果它是:

Account number: 1234567

awk应该返回:

1234567

一旦找到第一次出现,它就可以停止查找。

但是,我难住了。这样做的正确方法是什么awk

4

5 回答 5

51

单程:

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

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

于 2013-03-11T04:39:29.070 回答
8

您可以使用 anif检查是否等于“Account”和“number:” $1$2如果他们这样做,那么打印$3

> awk '{if ($1 == "Account" && $2 == "number:") {print $3; exit;}}' input.txt
于 2013-03-11T04:36:37.780 回答
4

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

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

这个解决方案忽略了:分隔符,但就像一个魅力,更容易记住 IMO。

于 2020-01-04T11:18:40.380 回答
3

对于这样的匹配,我更喜欢使用greplook-behind:

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
于 2015-11-27T13:20:10.047 回答
1

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

sed -En 's/^Account number: (.+)/\1/p' *.txt | head -n1
于 2013-03-11T07:28:16.643 回答