鉴于此文件:
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文档,但找不到任何容易的内容,你有什么建议吗?
由于
答案 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