繁体   English   中英

如何使用 grep 或 awk 从变量中获取字符串 select

[英]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// /}"
  • 第一行删除所有内容,包括 All Files
  • 由于不确定 All Files 之后有多少空格,我们再次删除第一个 <pipe> 字符之前的所有内容
  • 最后,我们删除第一个 <pipe> 字符之后的所有内容。
  • 最后一步,我们删除所有空格

我不相信你的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM