我想用点 grep 完整的单词。
就像我有文件一样test.txt
文件中的数据:
Abc ABC.xyz abc ABC.xyz
Def DEF.mno def DEF.mno
当我使用时,grep -o
我的输出低于
grep -o "\w*ABC\w*" test.txt
输出 :ABC
我想要完整的单词ABC.xyz
答案1
问题是这\w
意味着“单词字符”([a-zA-Z0-9_]
)并且.
从来不是单词的一部分:
$ echo . | grep '\w'
$
您可以只搜索非空白:
$ echo ABC.xyz | grep '\S*ABC\S*'
ABC.xyz
请注意,这\S
可能不会被普遍理解。如果它在您的实现中不起作用,请改用grep -E
。
答案2
awk '/ABC/ { print $NF }' test.txt
这将用于awk
将字符串ABC
与每行的内容进行匹配。如果一行匹配,则输出最后一个空格分隔的单词。
如果您想匹配该行的第一个字段,请使用$1 ~ /Abc/
而不是/ABC/
。如果您想与第一个字段进行字符串比较,请使用$1 == "Abc"
。
要传递您在命令行上进行比较的字符串,请使用例如
awk -v str="Abc" '$1 == str { print $NF }' test.txt
要传递您在命令行上进行比较的模式,请使用例如
awk -v pat="ABC" '$1 ~ pat { print $NF }' test.txt
更改$1
为$0
与整条线进行比较。
使用您自己的方法grep
,并假设您不知道文件名后缀(如果是的话),使用 GNU grep
:
grep -o '\<ABC\.\w*\>' test.txt
匹配\<
单词的开头,而\>
匹配单词的结尾。
这会给你二 ABC.txt
不过,因为它在第一行出现了两次。
对于非 GNU 实现,grep
您可以使用[_[:alnum:]]
来代替\w
(这也可以在 GNU 中工作grep
)。