使用 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 获取文件中字符串第一次出现的行号的主要内容,如果未能解决你的问题,请参考以下文章