Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 提取由点和另一个字符串分隔的字符串_Bash_Shell - Fatal编程技术网

Bash 提取由点和另一个字符串分隔的字符串

Bash 提取由点和另一个字符串分隔的字符串,bash,shell,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

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

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
读取时-r行
做
案例$line in
*Firefox*)打印“\”命令以执行$line“\”;;
*)打印“\”未知“;;
以撒
完成<文件名

非常感谢。

您的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
在perl中:

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

对sed尝试的一个小更正:

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

由于它是行中的最后一个字段,您可以执行以下操作:

awk -F'[ /]' '$(NF-1)=="Firefox"{print $NF}' file.log
它会打印检查它是否为“Firefox”的行,并打印后面的版本


只需在
上执行echo,即可获得版本

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
读取时-r行
做
案例$line in
*Firefox*)版本=$(echo$line | awk-F'[/]'{print$NF}')
打印“\”$version“\”;;
*)打印“\”未知“;;
以撒
完成<文件名

谢谢。但它在内部不起作用,而在内部循环。可能是因为印刷的缘故。我也更新了我的问题。有什么建议吗?我利用了KingsIndian的建议,并在案例中使用了您的代码。希望我能把所有的答案都标为正确:-)。谢谢你及时的帮助。谢谢。但它在内部不起作用,而在内部循环。可能是因为印刷的缘故。我也更新了我的问题。有什么建议吗?我利用了KingsIndian的建议,并在案例中使用了您的代码。希望我能把所有的答案都标为正确:-)。谢谢你及时的帮助。谢谢。但我也会将此代码用于其他浏览器,这可能不是最后一个字段。我还需要在执行循环时使用内部命令。请提供任何建议???@user1746666您可以在机箱内使用awk。请看我的编辑。非常感谢。我已经使用了您的建议来将代码放入案例中。对于不在最后一个字段的其他浏览器,我使用了其他答案。
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