egrep打印一条只有一吨的印刷线

时间:2018-12-05 04:40:05

标签: linux bash shell scripting grep

我正在尝试打印只有一个t或只有一个T的行,其他都可以。 IE中没有没有t的行,没有具有2个或更多t的行,也没有具有1 T和1 t的行。

我正在尝试:

egrep '[tT]{1,1}$' filename

这显示了以下几行:

     nopqrstuvwxyz
     letters    (this line is the one that should not be here)
 The price is *$2*
      one two three (this line should not be here either)
    ONE TWO
 THREE

这些是文件中所有带有t或T的行。我应该怎么做?

2 个答案:

答案 0 :(得分:3)

$ cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234

$ grep -ix '[^t]*t[^t]*' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -i忽略大小写
  • -x仅匹配整行
    • 默认情况下,grep匹配行中的任何地方
    • 如果没有-x,则需要grep -i '^[^t]*t[^t]*$'
  • [^t]*t以外的任何其他字符(由于有-i选项,T也将不匹配)


您也可以在此处使用awk

$ awk -F'[tT]' 'NF==2' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -F'[tT]'指定tT作为字段分隔符
  • NF==2如果行包含两个字段,即行中有一个tT
  • ,则打印

答案 1 :(得分:0)

如果您正在考虑使用Perl,则可以使用以下功能

> cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234
> perl -ne ' $x++ for(/t/ig);print if $x==1 ; $x=0 ' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
>

如果您需要精确匹配2个grep,只需将条件更改为$ x == 2。