在bash中,如何从特定表达式开始检索字符串?

时间:2016-04-19 09:45:19

标签: bash

鉴于此文件:

a=as/dsdf b=fdfsf c=vcv
c=15 b=1 a=azzzz))]ee
a=12 z=19 r=15

我只想检索以 a =

开头的部分

所以这种情况下的输出是:

a=as/dsdf
a=azzzz))]ee
a=12

我已经深入了解bash文档,但找不到任何容易的内容,你有什么建议吗?

由于

2 个答案:

答案 0 :(得分:4)

我假设您希望所有内容都以a=开头,直到下一个空格。

所有版本的grep都不支持它,但如果你有-o选项,这很容易:

grep -Eo 'a=[^ ]+' file

-o打印该行的匹配部分。 -E启用Extended Regular Expressions,这使您可以使用+来表示前一个 atom *的一个或多个次出现。 [^ ]表示除空格之外的任何字符。

否则,请使用sed捕获您感兴趣的部分:

sed -E 's/.*(a=[^ ]+).*/\1/' file

作为最后的手段,如果你的sed版本不支持扩展正则表达式,那么这适用于任何版本:

sed 's/.*\(a=[^ ]\{1,\}\).*/\1/' file

正如评论中正确指出的那样(感谢),为了避免打印不匹配的行,您可能还想使用-n来抑制输出并添加p命令打印匹配的行:

sed -nE 's/.*(a=[^ ]+).*/\1/p' file

atom *:字符类,标记的子表达式或单个字符。

答案 1 :(得分:0)

为了完整起见,这是一个纯粹的bash解决方案,不会回复外部程序:

while read -a fields
do
    for (( i=0; i< ${#fields}; i++ ))
    do
        [[ ${fields[i]} == a=* ]] && echo ${fields[$i]}
    done
done < gash.txt

这假定输入文件为gash.txt

我们read每行进入一个名为fields的数组,使用空格上的默认IFS拆分来填充数组。然后我们遍历数组,寻找glob构造a=*(不是正则表达式),这意味着a=后跟零个或多个任何字符。

这是一个awk解决方案(从bash调用):

awk -f - gash.txt << '_END_'
{ for (i=1; i <= NF; i++)
      if ($i ~ "^a=") print $i
}    
_END_

或者如果你喜欢单行:

awk '{for (i=1; i <= NF; i++) if ($i ~ "^a=") print $i }' gash.txt