目前,我在 bash 脚本中有一个命令,该命令对文本文件中的给定字符串进行 greps 并仅使用 sed ...
grep -n "<string>" file.txt | sed -n 's/^\([0-9]*\).*/\1/p'
grep 可以找到多个匹配项,因此打印多个行号。从这个命令的输出中,我想提取最小值和最大值,并将它们分配给相应的 bash 变量。我怎样才能最好地修改我现有的命令或添加新命令来完成这个?如果需要使用 awk 或 sed,我倾向于使用 sed。谢谢!
目前,我在 bash 脚本中有一个命令,该命令对文本文件中的给定字符串进行 greps 并仅使用 sed ...
grep -n "<string>" file.txt | sed -n 's/^\([0-9]*\).*/\1/p'
grep 可以找到多个匹配项,因此打印多个行号。从这个命令的输出中,我想提取最小值和最大值,并将它们分配给相应的 bash 变量。我怎样才能最好地修改我现有的命令或添加新命令来完成这个?如果需要使用 awk 或 sed,我倾向于使用 sed。谢谢!
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
grep -n "<string>" file.txt | sed -n -e '1s/^\([0-9]*\).*/\1/p' -e '$s/^\([0-9]*\).*/\1/p'
这就是我的做法,因为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
。
希望这可以帮助!
编辑:原来你不能按照我最初的方式去做,因为回显一个换行符分隔值的列表显然会将它们连接成一行。
grep .... |awk -F: '!f{print $1;f=1} END{print $1}'
它可以通过一个过程来完成。像这样:
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