[英]How to select a string from a variable using grep or awk
我有一个变量,其内容如下
----- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------------------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- All files | 36.95 | 20.87 | 24.
PS:我说的output其实挺长的,为了发在这里我删减了。 我通过反复试验发现所有文件 <> | 在 position 970-990 之间
我正在尝试提取与所有文件相关的值,即 36.95。 我可以像这样使用 cut 来获取 substring
TOTAL="$(cut -c 975-990 <<< $RES)"
但是我正在寻找更好的方法,例如使用正则表达式模式,我看到了 grep 和 awk 之类的模式,但我无法制定它。
既然你提到了它 - 这里有一个awk
替代方案:
total=$(awk -F'|' '{print $12}'<<<"${res}")
注意:所有大写变量名(更符合惯例)为系统保留。
如果您不限制自己cut
,这是一个可能的答案,使用sed
查找All files |... |
模式并从那里抓取文本。
TOTAL="$(sed -E 's/^.* All files \| ([^ ]+) \| .*$/\1/' <<< $RES)"
这是一个使用该想法的小脚本:
#!/bin/bash
RES="----- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------------------------------|---------|----------|---------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- All files | 36.95 | 20.87 | 24."
TOTAL="$(sed -E 's/^.* All files \| ([^ ]+) \| .*$/\1/' <<< $RES)"
echo "$TOTAL"
运行:
$ ./test.sh
36.95
由于RES
是一个 shell 变量,您可以这样做:
TOTAL="${RES#*All Files}"
TOTAL="${TOTAL#*|}"
TOTAL="${TOTAL%|*}"
TOTAL="${TOTAL// /}"
我不相信你的RES
变量内容都在 1 行上,我认为你是通过使用echo $RES
而不是echo "$RES"
让它看起来像这样,它真正包含的内容看起来更像:
$ echo "$RES"
----------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|------------------
All files | 36.95 | 20.87 | 24.
在这种情况下,您只需要:
$ echo "$RES" | awk -F' *[|] *' '/All files/{print $2}'
36.95
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.