在UNIX中grep一个选项卡

如何在Unix平台的文件中grep制表符(\ t)?

如果使用GNU grep,则可以使用Perl风格的正则expression式:

 $ grep -P '\t' * 

诀窍是在引号之前使用$符号。 它也适用于剪切和其他工具。

 $ grep $'\t' sample.txt 

我从未设法使'\ t'元字符与grep一起工作。 但是我发现了两个备选解决scheme

  1. 使用<Ctrl-V> <TAB> (点击Ctrl-V然后input标签)
  2. 使用awk: foo | awk '/\t/' foo | awk '/\t/'

从Ubuntu上的这个答案 :

告诉grep使用Perl定义的正则expression式(Perl有\t作为标签):

 grep -P "\t" <file name> 

使用文字标签字符:

 grep "^V<tab>" <filename> 

使用printf为您打印制表符:

 grep "$(printf '\t')" <filename> 

一种方法是(这是与Bash)

 grep -P '\t' 

-P打开Perl正则expression式,所以\ t将工作。

正如用户展开说的,它可能是特定于GNU grep。 另一种方法是在shell,编辑器或terminal允许的情况下,从字面上插入一个标签。

这不是你正在寻找的,但可能适用于你的情况

 grep '[[:blank:]]' 

相当于

 grep -P '[ \t]' 

所以它会find空间和标签。

§字符类

请注意,这是不是在我的man grep广告,但仍然有效

 $ man grep |  grep空白| 厕所
       0 0 0

使用echo为你插入标签grep "$(echo -e \\t)"

grep "$(printf '\t')"在Mac OS X上为我工作

一个不错的select是使用“sed as grep”(正如在这个传统的sed教程中所解释的)。

 sed -n 's/pattern/&/p' file 

示例(在bash,sh,ksh,csh中工作):

 [~]$ cat testfile 12 3 1 4 abc xa c ac\2 1 23 

 [~]$ sed -n 's/\t/&/p' testfile xa c ac\2 

 [~]$ sed -n 's/\ta\t/&/p' testfile ac\2 

基本上有两种解决方法:

  1. 推荐 )使用grep(1)支持的正则expression式语法。 现代grep(1)支持两种forms的POSIX 1003.2正则expression式语法: 基本 (过时)RE和现代 RE。 语法在分别是BSD和Linux系统的一部分的re_format(7)和regex(7)手册页中详细描述。 GNU grep(1)也支持pcre(3)库提供的与Perl兼容的RE。

    在正则expression式语言中,标签符号通常由\tprimefaces编码。 primefaces被BSD扩展正则expression式( egrepgrep -E ,BSD兼容系统)以及Perl兼容的RE( pcregrep ,GNU grep -P )支持。

    基本的正则expression式和Linux扩展的REs显然都不支持\t 。 请参阅UNIX实用程序手册页以了解它支持哪种正则expression式语言(因此,sed(1),awk(1)和pcregrep(1)正则expression式之间的区别)。

    因此,在Linux上:

     $ grep -P '\t' FILE ... 

    在BSD系统上:

     $ egrep '\t' FILE ... $ grep -E '\t' FILE ... 
  2. 将制表符转换为模式。 编辑脚本文件时,这很简单:

     # no tabs for Python please! grep -q ' ' *.py && exit 1 

    但是,在交互式shell中工作时,可能需要依靠shell和terminalfunction来将正确的符号input到行中。 在大多数terminal上,这可以通过Ctrl + V组合键完成,它指示terminal直接处理下一个input字符( V代表“逐字”):

     $ grep '<Ctrl>+<V><TAB>' FILE ... 

    一些shell可以提供对命令排版的高级支持。 这样,在bash(1)forms$'string'被特别处理:

     bash$ grep $'\t' FILE ... 

    请注意,虽然在命令行中很好,但当脚本移动到另一个平台时,这可能会产生兼容性问题。 另外,在使用特价商品时请注意报价,详情请参阅bash(1)。

    对于Bourne shell(不仅如此),可以使用由printf(1)增加的命令replace来模拟相同的行为来构造适当的正则expression式:

     $ grep "`printf '\t'`" FILE ... 

+1的方式,在ksh,破折号等工作:使用printf插入TAB:

 grep "$(printf 'BEGIN\tEND')" testfile.txt 

使用gawk,将字段分隔符设置为制表符(\ t)并检查字段数量。 如果超过1,则有标签

 awk -F"\t" 'NF>1' file 

答案更简单。 写你的grep,并在引用中键入tab键,至less在ksh中运行良好

 grep " " * 

在ksh我使用

 grep "[^I]" testfile 

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

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

如果你想使用行/文件信息,或其他grep选项,但也想看到可见的replace为制表符,您可以实现这一点

 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 

编辑:显然,以上是仅用于查看文件内容来定位选项卡—如果目标是处理选项卡作为一个较大的脚本会话的一部分,这不起任何有用的目的。

这适用于AIX。 我正在search包含JOINED<\t>ACTIVE

 voradmin cluster status | grep JOINED$'\t'ACTIVE vorudb201 1 MEMBER(g) JOINED ACTIVE *vorucaf01 2 SECONDARY JOINED ACTIVE 

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

只有要求是echo能够解释反斜杠转义。

这些替代的二进制识别方法是完全有效的 而且,我真的很喜欢那个使用awk的人,因为我不太记得单个二进制字符的合成使用。 但是,也应该可以用POSIX便携方式(即TAB = echo "@" | tr "\100" "\011" )为Shellvariables赋值,然后从POSIX便携式时尚; (即grep“$ TAB”文件名)。 虽然这个解决scheme可以很好的与TAB配合使用,但是当赋值中使用了另一个所需的二进制值(而不是TAB字符的值为“tr”)时,它也可以很好地工作于其他二进制字符。

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

注:以下是对于鱼壳,不能在bash中工作

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

 grep \t foo.txt 

或者可以使用hex或unicode符号,例如:

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

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

由于这些值必须是不加引号的,所以可以通过连接将引用值和非引用值相结合:

 grep "foo"\t"bar" 

你可以input

 grep \ t foo 

要么

 grep'\ t'foo

search文件foo中的制表符。 你也可以做其他的转义代码,虽然我只testing过\ n。 虽然这是相当耗时的,不清楚为什么你想要,在zsh中,你也可以input制表符,回到开始,grep,并用引号括住标签。

多次查找空格[[:space:]] *

grep [[:space:]] *'。''。'

会发现这样的事情:

'标签'..

这些是单引号('),而不是双(“)。
这是你如何在grep中进行连接。 = – )