【问题标题】:Using grep to get the line number of first occurrence of a string in a file使用 grep 获取文件中字符串第一次出现的行号
【发布时间】:2014-03-28 00:13:48
【问题描述】:

我使用 bash 脚本进行测试。在测试期间,我必须找到文件中第一次出现字符串的行号。我已经尝试过“awk”和“grep”,但它们都没有返回值。

Awk 示例

#/!bin/bash
....
VAR=searchstring
...
cpLines=$(awk '/$VAR/{print NR}' $MYDIR/Configuration.xml

这不会扩展 $VAR。如果我使用 VAR 的值,它可以工作,但我想使用 VAR

Grep 示例

#/!bin/bash
...
VAR=searchstring    
...
cpLines=grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: 

这给出了错误第 20 行:-n: command not found

【问题讨论】:

    标签: bash awk grep


    【解决方案1】:

    尝试类似:

    awk -v search="$var" '$0~search{print NR; exit}' inputFile
    

    awk 中,/ / 将按字面意思解释awk 变量。您需要使用match (~) 运算符。我们在这里所做的是根据您的输入行查找变量。如果匹配,我们打印存储在NR 中的行号并退出。

    -v 允许您在上面的示例中创建一个awk 变量(search)。然后,您将其分配给您的 bash 变量 ($var)。

    【讨论】:

    • 我最喜欢这个,因为它只使用一个进程。
    【解决方案2】:

    你需要 $() 在 grep 中进行变量替换

    cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: )
    

    【讨论】:

      【解决方案3】:
      grep -n -m 1 SEARCH_TERM FILE_PATH |sed  's/\([0-9]*\).*/\1/'
      

      grep 开关

      -n = 包括行号

      -m 1 = 匹配一个

      sed 选项(流编辑器):

      's/X/Y/' - 将 X 替换为 Y

      \([0-9]*\) - 正则表达式匹配数字零次或多次出现,转义括号,与括号中的正则表达式匹配的字符串将是 Y 中的 \1 参数(替换字符串)

      \([0-9]*\).* - .* 将匹配任何出现零次或多次的字符。

      【讨论】:

        【解决方案4】:
        grep -n -m 1 SEARCH_TERM FILE_PATH | grep -Po '^[0-9]+'
        

        解释:

         -Po = -P -o
        

        -P 使用 perl 正则表达式

        -o 只打印匹配的字符串(不是整行)

        【讨论】:

          【解决方案5】:

          试一试;

          grep -P 'SEARCH TERM' fileName.txt | wc -l

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-25
            • 2020-10-30
            相关资源
            最近更新 更多