Bash:在某个命令返回的行内找到一个单词

时间:2017-10-10 17:50:33

标签: bash grep

我想在一行中找到一个包含子词的单词。如果找到,我想看到它(第一个实例就足够了)。 groups ${whoami} | grep -i access_ftp的问题在于我看到了所有内容,而不仅仅是com.apple.access_ftp。那么,我可以用什么而不是grep?要搜索空格而不是新行?如果重要的话,这是一个macOS。

4 个答案:

答案 0 :(得分:2)

我不完全确定我理解你的问题,但是如果你只是想让你的正则表达式的部分匹配,你需要-o标志,例如:

groups $(whoami) | grep -io  '[^[:blank:]]*access_ftp[^[:blank:]]*'

[^[:blank:]]*匹配access_ftp

周围的任何非空白字符

示例:

$ echo music com.apple.access_ftp video com.apple.access_ftp dialout | grep -Eo '[^[:blank:]]*access_ftp[^[:blank:]]*'
com.apple.access_ftp
com.apple.access_ftp

答案 1 :(得分:1)

您要求的解决方案涉及较少的正则表达式。尝试:

groups | awk '/access_ftp/' RS=' '

示例:

$ echo music com.apple.access_ftp video com.apple.access_ftp dialout | awk '/access_ftp/' RS=' '
com.apple.access_ftp
com.apple.access_ftp

Awk一次读入一个记录RS=' '告诉awk使用空格作为记录分隔符。这样,每个单词都是记录/access_ftp/告诉awk打印包含access_ftp的任何记录。

不区分大小写的版本

groups | awk 'tolower($0) ~ /access_ftp/' RS=' '

示例:

$ echo music com.apple.access_ftp video com.apple.Access_FTP dialout | awk 'tolower($0)~/access_ftp/' RS=' '
com.apple.access_ftp
com.apple.Access_FTP

完全不区分大小写

如果我们的搜索字符串可能在错误的情况下提供给我们:

$ echo music com.apple.access_ftp video com.apple.Access_FTP dialout | awk -v x="aCcess_ftp" 'tolower($0)~tolower(x)' RS=' '
com.apple.access_ftp
com.apple.Access_FTP

答案 2 :(得分:1)

如果你希望grep处理单个单词而不是单词,最简单的方法就是用换行符替换所有空格:

groups $whoami | tr ' ' \\n | grep -i acess_ftp  

答案 3 :(得分:0)

使用egrep -io '[a-z.]+?.access_ftp'的惰性正则表达式匹配也应该这样做。