我有一堆文件,Account number: 123456789在不同的位置都有一行。
我需要做的是能够解析文件,并找到帐号本身。因此,awk需要查找Account number:并返回紧随其后的字符串。
例如,如果它是:
Account number: 1234567
awk应该返回:
1234567
一旦找到第一次出现,它就可以停止查找。
但是,我难住了。这样做的正确方法是什么awk?
单程:
awk -F: '$1=="Account number"{print $2;exit;}' file
我假设您想在文件中找到第一次出现的那一刻停止。如果您想在文件的每一行中查找匹配项,只需删除exit.
您可以使用 anif检查是否等于“Account”和“number:” $1。$2如果他们这样做,那么打印$3:
> awk '{if ($1 == "Account" && $2 == "number:") {print $3; exit;}}' input.txt
接受的答案在字符串前面输出一个空格,这迫使我使用另一种方法:
awk '/Account number/{print $3; exit}'
这个解决方案忽略了:分隔符,但就像一个魅力,更容易记住 IMO。
对于这样的匹配,我更喜欢使用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
你也可以使用sed -n s///p:
sed -En 's/^Account number: (.+)/\1/p' *.txt | head -n1