目前,我在bash脚本中有一个命令,它会在文本文件中为给定的字符串进行grep,并仅使用sed打印行号...
grep -n "<string>" file.txt | sed -n 's/^\([0-9]*\).*/\1/p'
grep可以找到多个匹配项,从而打印多个行号。从这个命令的输出,我想提取最小值和最大值,并将它们分配给相应的bash变量。我怎样才能最好地修改现有命令或添加新命令来完成此任务?如果需要使用awk或sed,我更喜欢使用sed。谢谢!
答案 0 :(得分:3)
您可以通过以下方式获得最低和最高:
grep -n "<string>" input | sed -n -e 's/^\([0-9]*\).*/\1/' -e '1p;$p'
您也可以将它们读入数组:
F=($(grep -n "<string>" input | sed -n -e 's/^\([0-9]*\).*/\1/' -e '1p;$p'))
echo ${F[0]} # min
echo ${F[1]} # max
答案 1 :(得分:2)
grep -n "<string>" file.txt | sed -n -e '1s/^\([0-9]*\).*/\1/p' -e '$s/^\([0-9]*\).*/\1/p'
答案 2 :(得分:1)
grep .... |awk -F: '!f{print $1;f=1} END{print $1}'
答案 3 :(得分:1)
以下是我的工作方式,因为grep -n 'pattern' file
以line number:line contents
格式打印输出...
minval=$(grep -n '<string>' input | cut -d':' -f1 | sort -n | head -1)
maxval=$(grep -n '<string>' input | cut -d':' -f1 | sort -n | tail -1)
cut -d':' -f1
命令在冒号周围分割grep
输出,只拉出第一个字段(行号),sort -n
按升序对数字行号进行排序(它们是已经存在,但确保它是好的做法),然后head -1
和tail -1
分别删除排序列表中的第一个和最后一个值,即最小值和最大值,并将它们分配给变量<{1}}和$minval
。
希望这有帮助!
编辑:事实证明你不能像我原来那样做,因为回显一个新行分隔值的列表显然将它们连接成一行。
答案 4 :(得分:0)
可以通过一个流程完成。像这样:
awk '/expression/{if(!n)print NR;n=NR} END {print n}' file.txt
然后你可以分配一个数组(按照建议的实际值)。或者您可以修改此脚本并使用eval
分配给可变数据eval $(awk '/expression/{if(!n)print "A="NR;n=NR} END {print "B="n}' file.txt)
echo $A
echo $B
输出(file.txt
包含三行expression
)
1
3