我知道如何使用awk来做到这一点,例如,保留行,第二列中包含数字3:$ awk '"$2" == 3'
但是如何只用 grep 做同样的事情呢?第一列呢?
Grep
对此不是很好,awk
更好。但是假设您的列由空格分隔,那么您需要
grep -E '^[^ ]+ +3( |$)'
说明:查找具有行首的内容,后跟一个或多个非空格字符(第一列),然后是一个或多个空格字符(列分隔符),然后是数字 3,然后是空格(因为有另一列)或行尾(如果没有其他列)。
(测试后更新以修复语法。
以下是我对评论中神秘命令grep -P '^[^t]*t3t' your_file
的较长解释:
我假设列分隔符是一个制表符。 没有-P
的 grep 需要一些奇怪的东西才能直接使用它(参见例如 见这里 )。该-P
可以毫无问题地编写t
。例如,如果您的分隔符;
那么您可以将t
替换为;
,并且不需要-P
选项。
话虽如此,让我们解释一下正则表达式背后的想法:您说,您想匹配第二列中的3
:
-
^
表示:在行首 -
[^t]*
的意思是:零次或多次(*
)不是制表符的事物的出现([^t]
这里的^
的意思是"不是a") - 后跟制表符
- 其次是
3
- 后跟制表符
现在我们已经有效地表达了我们需要一个3
作为第二列的内容的想法(t3t
),我们对第一列的精确内容不感兴趣。^[^t]*t
只需要表达"接下来的内容在第二列中"的想法。
某些内容,则可以使用它来"跳过"前三列并匹配第四列中的4:
^([^t]*t){3}4
。(注意括号和{3}
)。
正如你所看到的许多细节和awk更加优雅和容易。
你可以在 grep 的文档中阅读这一点,然后你需要学习一些关于正则表达式的东西,例如从这里开始。