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

Posted

技术标签:

【中文标题】使用 grep 获取文件中字符串第一次出现的行号【英文标题】:Using grep to get the line number of first occurrence of a string in a file 【发布时间】: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

【问题讨论】:

【参考方案1】:

尝试类似:

awk -v search="$var" '$0~searchprint 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

【讨论】:

以上是关于使用 grep 获取文件中字符串第一次出现的行号的主要内容,如果未能解决你的问题,请参考以下文章

如何格式化我的 grep 输出以在行尾显示行号以及命中数?

linux获取日志指定行数范围内的内容

grep

grep命令的基本用法

Linux进阶命令之grep查找字符串

六周第一次课 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下