2

目前,我在 bash 脚本中有一个命令,该命令对文本文件中的给定字符串进行 greps 并仅使用 sed ...

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

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

4

5 回答 5

3

You can get the minimum and maximum with this:

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

You can also read them into an array:

F=($(grep -n "<string>" input | sed -n -e 's/^\([0-9]*\).*/\1/' -e '1p;$p'))
echo ${F[0]} # min
echo ${F[1]} # max
于 2013-04-16T20:18:41.480 回答
2
grep -n "<string>" file.txt | sed -n -e '1s/^\([0-9]*\).*/\1/p' -e '$s/^\([0-9]*\).*/\1/p'
于 2013-04-16T20:18:13.913 回答
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删除排序列表中的第一个和最后一个值,即最小值和最大值,并将它们分别分配给变量$minval$maxval

希望这可以帮助!

编辑:原来你不能按照我最初的方式去做,因为回显一个换行符分隔值的列表显然会将它们连接成一行。

于 2013-04-16T20:34:56.463 回答
1
grep .... |awk -F: '!f{print $1;f=1} END{print $1}'
于 2013-04-16T20:25:27.677 回答
0

它可以通过一个过程来完成。像这样:

awk '/expression/{if(!n)print NR;n=NR} END {print n}' file.txt

然后您可以分配给一个数组(按照 perreal 的建议)。或者您可以修改此脚本并使用 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
于 2013-04-16T21:18:40.407 回答