Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
String 如何在shell脚本中打印字符串的最后一部分_String_Shell_Awk - Fatal编程技术网

String 如何在shell脚本中打印字符串的最后一部分

String 如何在shell脚本中打印字符串的最后一部分,string,shell,awk,String,Shell,Awk,我有一句话: 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.

我有一句话:

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

我已经阅读了其他堆栈溢出问题,它们似乎没有完全理解我所寻找的内容。我注意到他们把你弄醒了。我应该做什么才能只提取上述val=”之后的部分行?

您可以使用awk和字段分隔符作为
=
并打印最后一个字段:

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

-5.35

awk-F'=''{print$NF}'不需要
awk
sed
或任何其他外部工具:bash有自己的内置正则表达式支持,通过
=~
操作符到
[[]
,以及
bash\u重新匹配
数组(填充匹配的内容)


这就是说,如果您真的想删除字符串
val=
之前的所有内容(从而在将来向格式中添加其他值时使代码中断),您也可以这样做:

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

这里的语法是。另请参见

这将从末尾搜索字符串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=).*'
str='102:20620453:d=2017021012:UGRD:10米地上15小时fcst::lon=79.500000,lat=9.000000,val=-5.35'

echo“$str”| grep-Po'(?
val
绝对肯定是每行中的最后一个字段吗?不仅是当前版本的日志字符串,而且是所有未来版本的日志字符串?就个人而言,我会小心做出这样的假设。顺便问一下--您是一次处理一行,还是一次处理一个完整的文件?它在性能上有很大的不同:Y对于大数据流,最好使用
awk
,而如果一次只运行一行,则使用bash内置将节省启动外部进程的(显著)成本。(也就是说:如果您只是在每行日志中运行一个awk副本,那么anubhava给出的答案比我的慢得多,但是使用anubhava的awk并给它20MB的日志一次解析要比在循环中使用bash内置字符串操作快得多)…中给出了保证在
grep
中可用的功能的完整列表。并不是说编写依赖于扩展的StackOverflow答案是不好的,而是当答案仅适用于GNU grep、现代BSD grep或其他特定实现时,应该调用它。(实际上,即使使用GNU grep,
-P
支持也依赖于编译时标志,而编译时标志只能在使用libpcre的系统上启用)…re:
echo$str
,请参阅或运行您的代码,并按照警告中的链接进行操作。您已更正了引用问题,但您的回答仍然没有提到使用
-P
需要GNU
grep
。请将正则表达式包含在
中…”
而不是
“…”
是不明智的,除非您有意嵌入shell变量引用。
[^$]
在这里没有任何意义(它匹配任何字符。除了(
^
)一个文本
$
)-您的意思可能只是
。最后,请。
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=).*'