2017-02-10 79 views
-2

字符串的最后一部分我有这样一行:如何打印在shell脚本

102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35 

现在我只想打印从这一行,没有别的值-5.35。

我也希望这个命令能够从这行提取-7.04,没有别的。

102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=280.500000,lat=11.000000,val=-7.04 

我已经阅读了其他堆栈溢出问题,他们似乎并没有完全知道我在找什么。我注意到他们是你awk或sed。在val =之后,我应该做什么类型的事情才能够提取上述部分行?

+0

是'val'绝对,积极保证是最后一次后,给什么每行中的字段 - 不仅仅是当前版本的日志字符串,还包括所有将来的版本?就我个人而言,我会谨慎做出这样的假设。 –

+1

顺便说一句 - 你是一个人一次处理一行还是一个文件?它在性能上有很大的不同:你最好使用'awk'来处理大流,而如果你每次都要使用一条线,那么使用bash builtins会节省启动外部进程的(显着)成本。 (也就是说:如果你只是运行每行日志的awk的一个副本,那么anubhava的答案比我的慢得多,但是采用anubhava的awk并给它20MB的日志来解析所有的日志要比使用它快得多bash-builtin字符串操作循环)。 –

回答

2

有没有必要awksed,或任何其他外部工具:bash有它自己的内置正则表达式的支持,通过=~运营商到[[ ]],和BASH_REMATCH阵列(填充匹配的内容)。

val_re='[, ]val=([^ ]+)' 
line='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35' 
[[ $line =~ $val_re ]] && echo "${BASH_REMATCH[1]}" 

这就是说,如果你真的要删除一切直至并包括字符串val=(因此有你的代码休息,如果其他值在未来加入到格式),你也可以这样做是这样的:

val=${line##*val=} # assign everything from $line after the last instance of "val=" to val 

这里的语法是parameter expansion。又见BashFAQ #100: How do I do string manipulations in bash?

1

您可以用awk与现场分隔为=和打印最后一个字段:

awk -F'=' '{print $NF}' <<< "$str" 

-5.35 
0

这将搜索服务由结束的字符串VAL =和

str='102:20620453:d=2017021012:UGRD:10 m above ground:15 hour fcst::lon=79.500000,lat=9.000000,val=-5.35' 

echo "$str" | grep -Po '(?<=val=).*' 

答案适用于GNU的grep只

+1

...在'grep'中保证*的特性的完整列表在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html中给出。不是说写一个依赖于扩展的StackOverflow答案并不好,但是当答案仅适用于GNU grep,现代BSD grep或其他特定实现时,应该调用它。 (实际上,即使使用GNU grep,'-P'支持取决于只能在具有libpcre的系统上启用的编译时标志)。 –

+1

... re:'echo $ str',参见[BashPitfalls#14](http://mywiki.wooledge.org/BashPitfalls#echo_.24foo),或者通过http://shellcheck.net/运行你的代码,请按照[SC2086](https://github.com/koalaman/shellcheck/wiki/SC2086)的警告中的链接进行操作。 –

+0

你已经纠正了引用问题,但你的答案仍然没有提到使用'-P'需要_GNU_' grep'。除非你有意要嵌入shell变量引用,否则不要在'“...”'中包含正则表达式,而不要使用“...”。 '[^ $]'在这里没有任何意义(它匹配任何char。_except_('^')a _literal_'$') - 你可能只是'.'。最后。请[请正确格式化您的代码](http://meta.stackexchange.com/a/22189/248777)。 – mklement0