如何输出我要抓取的字符串?

时间:2019-02-26 21:29:41

标签: bash shell grep

我正在尝试grep或awk一些非常简单的操作,无法执行。

#!/bin/sh
textfile="1_abc 2_def 3_xyz"
echo "$textfile"
new=$(echo "$textfile" | grep -o "xyz" )
echo "$new"

$ new是xyz,我想要的输出是3_xyz

我已经尝试过grep的不同切换,但是没有运气。

3 个答案:

答案 0 :(得分:2)

Grep不在乎单词,它只是匹配字符,因此在您的示例中,匹配了“ 3_xyz”,而匹配了“ xyz”。无法知道您是否考虑了比赛的“ 3_”部分,但也没有考虑比赛之前的“ def”。

为了输出所需的整个字符串,您需要一个与整个字符串匹配的grep模式。看起来到底取决于实际输入的样子,但是对于给出的示例,它可能是[0-9]_xyz..xyz,或者也许是[^ ]+xyz

答案 1 :(得分:2)

$ echo "$textfile" | grep -o '[^[:space:]]*xyz[^[:space:]]*'
3_xyz

或对于多字符RS和\s速记使用GNU awk:

$ echo "$textfile" | awk -v RS='\\s' '/xyz/'
3_xyz

或者如果您真的确定$textfile包含什么并且不能有任何通配符等(或设置noglob):

$ printf '%s\n' $textfile | grep 'xyz'
3_xyz

答案 2 :(得分:2)

缓慢而简单:

textfile="1_abc 2_def 3_xyz"
echo "$textfile" | tr ' ' '\n' | grep xyz

用空格替换换行符,然后用grap替换插入的字符串。