grep - 打印包含'cat'的所有行作为第二个单词

时间:2013-03-24 22:47:06

标签: linux shell grep

好的,所以考虑到我有一个包含以下文字的文件:

lknsglkn cat lknrhlkn lsrhkn
cat lknerylnk lknaselk cat
awiooiyt lkndrhlk dhlknl
blabla cat cat bla bla

我需要使用grep只打印包含'cat'的行作为行的第二个单词,即第1行和第4行。我尝试了多个grep -e 'regex' <file>命令,但似乎无法获得正确对象,真爱。我不知道如何匹配第N行的字。

4 个答案:

答案 0 :(得分:4)

这对你有用吗?

grep -E '^\w+\s+cat\s' file

如果第一个“单词”可以包含一些非单词字符,例如"#, (,[..",您也可以尝试:

grep -E '^\S+\s+cat\s' file

使用您的示例输入:

kent$  echo "lknsglkn cat lknrhlkn lsrhkn
cat lknerylnk lknaselk cat
awiooiyt lkndrhlk dhlknl
blabla cat cat bla bla"|grep -E '^\S+\s+cat\s'
lknsglkn cat lknrhlkn lsrhkn
blabla cat cat bla bla

答案 1 :(得分:1)

什么构成一个词?

grep '^[a-z][a-z]*  *cat '

如果cat之后至少有空白,这将有效。如果不能保证,那么:

grep -E '^[a-z]+ +cat( |$)'

查找cat后跟空格或行尾。

如果您想要更广泛地定义“第一个单词”(大写,数字,标点符号),请更改字符类。如果要允许空格或制表符,可以进行更改。如果您有前导空格,请在插入符号中添加“*”。根据需要进行变更。

这些变体适用于支持grep选项的任何-E版本。虽然GNU \S支持将其作为扩展,但POSIX并未强制grep等符号表示“非空白”。如果grep -E不起作用但egrep存在,则grep -E版本将与常规egrep一起使用(不要将-E选项与egrep一起使用)。

答案 2 :(得分:0)

以下内容应该有效:

grep -e '^\S\+\scat\s'

该行应以长度至少为1的非空白字符开头,后跟空格和“cat”后跟空格。

答案 3 :(得分:0)

会慢一些,但可能更具可读性:

awk '$2 == "cat"' file