linux命令获取文本文件中字符串的最后一次出现

时间:2013-05-07 13:39:13

标签: linux awk command text-files

我想用linux命令在文本文件中找到字符串的最后一次出现。例如

1 a 1
2 a 2
3 a 3
1 b 1
2 b 2
3 b 3
1 c 1
2 c 2
3 c 3

在这样的文本文件中,我想找到b的最后一次出现的行号,即6。 我可以找到第一次出现

awk '/ b / {print NR;exit}' textFile.txt

但我不知道如何在最后一次出现时这样做。

3 个答案:

答案 0 :(得分:9)

cat -n textfile.txt | grep " b " | tail -1 |  cut -f 1
  • cat -n将文件打印到STDOUT前缀行号。
  • grep将所有包含“b”的行打开(你可以使用egrep获取更高级的模式,或者使用fgrep获得更快的固定字符串grep)
  • tail -1打印包含“b”
  • 的行的最后一行
  • cut -f 1打印第一列,即cat -n
  • 行#

或者如果你愿意,你可以使用Perl(这与你在awk中所做的非常相似,但坦率地说,如果我有Perl方便,我个人不会使用awk - Perl支持awk可以做的100% ,按设计,作为1-liners - YMMV):

perl -ne '{$n=$. if / b /} END {print "$n\n"}' textfile.txt 

答案 1 :(得分:3)

这可行:

$ awk '{if ($2~"b") a=NR} END{print a}' your_file

我们检查每个第二个文件是“b”,并记录行数。它是附加的,所以当我们读完文件时,它将是最后一个。

测试:

$ awk '{if ($2~"b") a=NR} END{print a}' your_file
6

根据sudo_O advise更新:

$ awk '{if ($2=="b") a=NR} END{print a}' your_file

避免在第二个字段中有一些abc

它也是有效的(更短的,我保留上面的那个,因为它是我认为的那个:D):

$ awk '$2=="b" {a=NR} END{print a}' your_file

答案 2 :(得分:0)

另一种方法,如果$ 2总是被分组(可能更有效,然后等到结束):

awk 'NR==1||$2=="b",$2=="b"{next} {print NR-1; exit}' file

awk '$2=="b"{f=1} f==1 && $2!="b" {print NR-1; exit}' file