如何同时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 以外的任何内容开头
我怎样才能 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 以外的任何内容开头