从行号grep中提取最小值和最大值

时间:2013-04-16 20:13:41

标签: bash

目前,我在bash脚本中有一个命令,它会在文本文件中为给定的字符串进行grep,并仅使用sed打印行号...

grep -n "<string>" file.txt | sed -n 's/^\([0-9]*\).*/\1/p'

grep可以找到多个匹配项,从而打印多个行号。从这个命令的输出,我想提取最小值和最大值,并将它们分配给相应的bash变量。我怎样才能最好地修改现有命令或添加新命令来完成此任务?如果需要使用awk或sed,我更喜欢使用sed。谢谢!

5 个答案:

答案 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' fileline 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 -1tail -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