提取由点分隔的字符串,后跟另一个字符串

时间:2012-12-12 11:23:08

标签: bash shell

我需要获取浏览器版本,后面跟我的日志文件中的浏览器名称和/。实施例

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0.5.7

在这里,我想提取Firefox之后的版本,即17.0.5.7。我尝试了以下,但没有成功。因为我正在使用AIX,所以我无法使用-O标志。

grep -w 'Firefox\/[^ ,]\+' $line
sed 's/^.*\(Firefox\/[^ ,]*\).*$/\1/' $line

此外,我需要使用内部命令,同时执行如下循环

while read -r line
do
case $line in    
*Firefox*) print "<browser Firefox>\"" command_to_be_executed $line "\"</browser>";;
*) print "<browser>\"Unknown\"</browser>";;
esac
done < filename

谢谢你。

3 个答案:

答案 0 :(得分:1)

你的sed版本出了什么问题,在Firefox之前是一个大括号。改变如下:

sed 's/^.*Firefox\/\([^ ,]*\).*$/\1/' your_file

以上应该有效。 其他方法是:

awk '{for(i=1;i<=NF;i++)if($i~/Firefox/){split($i,a,"/");print a[2]}}' file_name

也在sed(为我工作):

sed -e 's/.*Firefox\/\([^\s]*\)/\1/g' your_file

in perl:

perl -F -ane 'foreach (@F){if(/Firefox/){$_=~s/Firefox\///g;print $_}}' your_file

答案 1 :(得分:1)

对您的sed尝试进行小幅修正:

$ sed 's|.*Firefox/\([^ ,]*\).*|\1|' file
17.0.5.7

答案 2 :(得分:1)

由于它是该行中的最后一个字段,您可以这样做:

awk -F'[ /]' '$(NF-1)=="Firefox"{print $NF}' file.log

它会打印检查它是否为“Firefox”的行并打印出随后的版本。


只需在line上回显并获取版本。

while read -r line
do
case $line in    
*Firefox*) version=$(echo $line | awk -F'[ /]' '{print $NF}' )
print "<browser Firefox>\"" $version "\"</browser>";;
*) print "<browser>\"Unknown\"</browser>";;
esac
done < filename