在UNIX中grep一个选项卡
如何在Unix平台的文件中grep
制表符(\ t)?
如果使用GNU grep,则可以使用Perl风格的正则expression式:
$ grep -P '\t' *
诀窍是在单引号之前使用$符号。 它也适用于剪切和其他工具。
$ grep $'\t' sample.txt
我从未设法使'\ t'元字符与grep一起工作。 但是我发现了两个备选解决scheme
- 使用
<Ctrl-V> <TAB>
(点击Ctrl-V然后input标签) - 使用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
基本上有两种解决方法:
-
( 推荐 )使用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式语言中,标签符号通常由
\t
primefaces编码。 primefaces被BSD扩展正则expression式(egrep
,grep -E
,BSD兼容系统)以及Perl兼容的RE(pcregrep
,GNUgrep -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 ...
-
将制表符转换为模式。 编辑脚本文件时,这很简单:
# 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中进行连接。 = – )