如何在Unix平台上的文件中grep标签(\t) ?


当前回答

使用'sed-as-grep'方法,但是用个人偏好的可见字符替换制表符是我最喜欢的方法,因为它清楚地显示了哪些文件包含所请求的信息,以及它在行的位置:

sed -n 's/\t/\*\*\*\*/g' file_name

如果您希望使用行/文件信息,或其他grep选项,但也希望看到制表符的可见替换,您可以通过

grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'

举个例子:

$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar

编辑:显然,上面的内容只对查看文件内容以定位选项卡有用——如果目标是将选项卡作为更大的脚本会话的一部分来处理,那么这没有任何有用的用途。

其他回答

你可能想使用grep "$(echo -e '\t')"

唯一的要求是echo能够解释反斜杠转义。

这对于AIX很有效。我正在搜索包含连接<\t>ACTIVE的行

voradmin cluster status | grep  JOINED$'\t'ACTIVE

 vorudb201   1       MEMBER(g) JOINED        ACTIVE
*vorucaf01   2       SECONDARY JOINED        ACTIVE

如果使用GNU grep,你可以使用perl风格的regexp:

grep -P '\t' *

在其他答案中给出的$'\t'符号是特定于shell的——它似乎在bash和zsh中工作,但不是通用的。

注意:下面是针对fish shell的,在bash中不起作用:

在fish shell中,可以使用不带引号的\t,例如:

grep \t foo.txt

或者可以使用十六进制或unicode符号,例如:

grep \X09 foo.txt
grep \U0009 foo.txt

(这些符号对于更深奥的字符很有用)

因为这些值必须是不加引号的,所以可以将加引号的值和不加引号的值进行拼接:

grep "foo"\t"bar"

一种方法是(这是Bash)

grep -P '\t'

-P将打开Perl正则表达式,因此\t将工作。

正如用户unwind所说,它可能是特定于GNU grep的。另一种方法是在shell、编辑器或终端允许的情况下插入一个制表符。