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