使用grep获取文件中第一次出现字符串的行号

时间:2014-02-25 16:11:48

标签: bash awk grep

我正在使用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

5 个答案:

答案 0 :(得分:10)

grep -n -m 1 SEARCH_TERM FILE_PATH |sed  's/\([0-9]*\).*/\1/'

grep开关

-n =包含行号

-m 1 =匹配一个

sed选项(流编辑器):

's/X/Y/' - 用Y替换X

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

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

答案 1 :(得分:8)

在grep

中需要$()进行变量替换
cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: )

答案 2 :(得分:5)

尝试类似:

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

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

-v允许您在上面的示例中创建awk变量(search)。然后,您可以为其指定bash变量($var)。

答案 3 :(得分:0)

grep -n -m 1 SEARCH_TERM FILE_PATH | grep -Po '^[0-9]+'

说明:

 -Po = -P -o

-P使用perl正则表达式

-o仅显示匹配的字符串(而不是整行)

答案 4 :(得分:0)

尝试尝试;

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