我正在使用bash脚本进行测试。在我的测试过程中,我必须找到文件中第一次出现的字符串的行号。我已经尝试了"awk"和"grep",但没有一个返回值。
awk 示例
#/!bin/bash
....
VAR=searchstring
...
cpLines=$(awk '/$VAR/{print NR}' $MYDIR/Configuration.xml
这不会$VAR展开。如果我使用 VAR 的值,它可以工作,但我想使用 VAR
格雷普示例
#/!bin/bash
...
VAR=searchstring
...
cpLines=grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d:
这给出了错误行 20:-n:找不到命令
grep -n -m 1 SEARCH_TERM FILE_PATH |sed 's/([0-9]*).*/1/'
格瑞普开关
-n = 包含行号
-m 1 = 匹配 1
SED 选项(流编辑器):
's/X/Y/'
- 将 X 替换为 Y
([0-9]*)
- 正则表达式匹配零次或多次出现的数字,转义括号,括号中与正则表达式匹配的字符串将是 Y 中的 \1 参数(替换字符串)
([0-9]*).*
- .*
将匹配出现零次或多次的任何字符。
你需要 $() 在 grep 中进行变量替换
cpLines=$(grep -n -m 1 $VAR $MYDIR/Configuration.xml |cut -f1 -d: )
尝试如下操作:
awk -v search="$var" '$0~search{print NR; exit}' inputFile
在awk
中,/ /
将按字面解释awk
变量。您需要使用match
(~
)运算符。我们在这里所做的是针对您的输入行查找变量。如果匹配,我们打印存储在NR
中的行号并退出。
-v
允许您在上面的示例中创建一个awk
变量(search
)。然后,将其分配给您的bash
变量 ( $var
)。
grep -n -m 1 SEARCH_TERM FILE_PATH | grep -Po '^[0-9]+'
解释:
-Po = -P -o
-P
使用 perl 正则表达式
-o
仅打印匹配的字符串(而不是整行)
尝试翘曲;
grep -P 'SEARCH TERM' fileName.txt | wc -l