如何使用shell脚本确定文件中最后一次出现字符串的行号?

时间:2016-12-10 12:28:01

标签: shell zsh

在我自己努力解决我在Ask Fedora中this opened question的问题时,我一直在尝试确定Fedora文件中最后一次出现字符串/boot/grub2/grub.cfg的行号。有没有办法使用sedgrepawk或任何其他常见shell(特别是Z Shell,如果我正在使用的特定Unix shell)命令?例如,我想要的命令将为this grub.cfg文件返回127(即第127行,这是字符串Fedora最后一次出现的位置)。我将使用此shell命令来确定此行号,以便我可以将其提供给sed(sed命令与this question中的with Ada.Text_IO; use Ada.Text_IO; procedure c_case_example is c_case : natural range 1 .. 10 := 1; begin case c_case is when 1 => goto case_1; when 3 .. 5 => goto case_3; when 6|8 => goto case_6; when others => goto case_others; end case; <<case_1>> put_line("Case 1"); <<case_3>> put_line("Case 3,4,5"); goto break; <<case_6>> put_line("Case 6,8"); <<case_others>> put_line("all other cases"); <<break>> null; put_line("Done"); end c_case_example; 命令类似,因为我只想在这些命令后面的行中替换正则表达式提到Fedora)。

1 个答案:

答案 0 :(得分:4)

使用awk:

awk '/Fedora/ { ln = FNR } END { print ln }'

使用grep:

grep -n 'Fedora' | tail -n1 | cut -d: -f1

使用shell(仅在bash中测试):

unset ln lnr
while read -r; do
    ((lnr++))
    case "$REPLY" in
        *Fedora*) ln="$lnr";;
    esac
done < grub.cfg
echo $ln