返回数据直到第N个字符X出现

时间:2011-09-15 13:35:15

标签: unix sed awk grep

使用目录我有多个文件在文件中有多个版本号。我在这些版本号的目录中搜索每个文件,对它们进行排序以获取最新的版本号,然后将其汇总到“tail -1”中,只传递给最新的版本号而不是每个grep结果。

数据看起来像这样:

file1:asdf garbage 1.2.4.1 garbagetext asdf

file2:fsdaf garbage asdfsda 4.3.2.10 fdsaf

等等。我已经完成了提取最新版本号的工作。我用以下方法做到了这一点:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1

下一部分就是我遇到的麻烦。我试图在第一个句点之前提取数字(无论是一个数字字符还是两个数字字符)并返回该结果。然后,我假设一个略有不同的命令做同样的事情,但对于第一个时期后的数字。再次为第二期后的数字,最后是第三期后的数字。

我对sed或awk几乎没有经验,但经过一番研究后,我相信这些工具中的任何一种都是实现这一目标的方法。

谢谢!

编辑:好吧,我明白了,但我确信这可以通过更简单的方式完成。我所拥有的是以下内容:

grep -o '[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}' * | sort | tail -1 | grep -o '[0-9]\{1,\}' | sed -n 2p

或sed -n 1p,3p,4p取决于我想要的值。

2 个答案:

答案 0 :(得分:1)

获取最新版本号:

grep  -P -o "\d+\.\d+\.\d+\.\d+" * |sed 's/.*://g'|awk -F'.' '{v[$0]=($1"."$2$3$4)+0;}END{m=0;for(x in v)if(v[x]>m){m=v[x];n=x;}print n}' 

提取数字:

kent$  echo "10.2.30.4"|awk -F'.' -v OFS="\n" '$1=$1'    
10
2
30
4

你可以将两条线放在一起。

答案 1 :(得分:0)

要提取版本号,而不必知道其中有多少个点,我会使用

grep -o '[0-9.]\+' filename | sort --version-sort | tail -1

(假设你有GNU排序,--version-sort选项)

要获得主要版本号,请将上述内容输入

之一
sed 's/\..*//'
while read line; do echo ${line%%.*}; done