如何同时grep和过滤掉?

How to grep and filter out at the same time?

我怎样才能 grep 以数字 2 开头的行,不包括制表符后的数字 26

file1.txt:

2    0   'C001000'
2    26 'C001000' So we come to step 3
2    0   'C001000'
2    26 'C001000' So we come to step 3


expected output 

    2    0   'C001000'
    2    0   'C001000'
   

我的方法 猫 file1.txt | grep '^2' // 抓取以 2

开头的所有行
cat file1.txt | grap '^2' $(printf '\t') '26'

据我所知,这应该可行:

awk -F'\t' '==2 && !=26' ip.txt

这将根据制表符处理字段。如果第一个字段是 2 而第二个字段是 not 26,将打印该行。

如果您还需要打印以 2 开头的行,例如 2a,请使用:

awk -F'\t' ' ~ /^2/ && !=26' ip.txt

以上解决方案仅在第二个字段之后的字符也是制表符时才有效。如果不是这种情况,那么这可能有效,但需要对输入进行更好的描述。

awk -F'\t' '==2 &&  !~ /^26([[:space:]]|$)/' ip.txt

使用 GNU grep:

grep -P '^2(?!\t26\b)' file

哪里

  • -P - 启用 PCRE 正则表达式引擎
  • ^2(?!\t26\b) - 匹配
    • ^ - 字符串开始(jhere,行)
    • 2 - 一个 2
    • (?!\t26\b) - 后面没有制表符和 26 作为一个完整的词(\b 是一个词边界)。您可以使用 (?!\t26(?:\t|$))(?!\t26(?![^\t])) 来确保 26 仅在字符串的选项卡 chars/end 之间匹配。

看到 online demo:

s="2    0   'C001000'
2   26  'C001000'   So we come to step 3
2   0   'C001000'
2   26  'C001000'   So we come to step 3"
grep -P '^2(?!\t26\b)' <<< "$s"

输出:

2   0   'C001000'
2   0   'C001000'

使用 OP 评论中的要求:行以 2 开头,后跟制表符,然后排除以 26 开头的数字 - 和 grep:

$ grep $'^2[\t]\(2[^6]\|[^2]\)' file

使用示例数据输出:

2       0       'C001000'
2       0       'C001000'

解释了一些:

  • grep $'\t' 此语法用于 grep for tab
  • ^2[\t] 行以 2 开始,后跟制表符
  • \(2[^6]\|[^2]\) 然后 [我的定义* of] 排除以26开头的数字
  • \(2[^6]\|[^2]\) 基本上是 以 2 开头,然后是除 6 以外的任何内容,或者以除 2 以外的任何内容开头