awk: 从文件中读取模式,awk ‘$2 !~ /{换行分隔的文件}/ && $1 > 5000’

huangapple go评论109阅读模式
英文:

awk: read pattern from file, awk '$2 !~ /{newline delimited file}/ && $1 > 5000'

问题

我有一个命令,它将输出进行管道传输,如下所示:

   1365 8.67.53.0.9
   2657 1.2.3.4
   5956 127.9.9.0
  10463 127.0.0.1
  15670 6.5.4.3.2
  17984 -

转换为:

awk '$2 !~ /-|127.0.0.1|6.5.4.3.2/ && $1 > 5000'

这个命令会打印出:

   5956 127.9.9.0

或者所有 $2 不包含 -127.0.0.16.5.4.3.2,且 $1 大于 5000 的行。

我想将所有应该被忽略的值保存在一个以换行符分隔的文件中,如下所示:

-
127.0.0.1
6.5.4.3.2

而不是在正则表达式 /-|127.0.0.1|6.5.4.3.2/ 中,因为我这些值的列表会不断增长。

理想情况下,这可以在一个单独的命令中完成,而不是一个函数或 awk 程序文件。另外,如果可能的话,我希望匹配更精确一些(贪婪度更低?)。我认为当前的正则表达式也会匹配类似于 127.0.0.11 或 6.5.4.3.22 的内容。

英文:

I have a command that that pipes output like:

   1365 8.67.53.0.9
   2657 1.2.3.4
   5956 127.9.9.0
  10463 127.0.0.1
  15670 6.5.4.3.2
  17984 -

to:

awk '$2 !~ /-|127.0.0.1|6.5.4.3.2/ && $1 > 5000'

which should print:

   5956 127.9.9.0

or all the ones where $2 doesn't contain -, 127.0.0.1, or 6.5.4.3.2 and where $1 is greater than 5000.

I would like to keep all of the values that should be ignored in a newline delimited file like:

-
127.0.0.1
6.5.4.3.2

rather than within the regex /-|127.0.0.1|6.5.4.3.2/ because my list of these will be growing.

Ideally, this could be within a single command and not a function or awk program file. Also, if possible I would like the matching to be more exact (less greedy?). I think the current regex will also match something like 127.0.0.11 or 6.5.4.3.22.

答案1

得分: 4

你可以将要跳过的值保存在一个名为skip的文件中,格式如下:

cat skip

-
127.0.0.1
6.5.4.3.2

然后使用以下命令运行awk,同时使用两个文件:

awk 'NR == FNR {omit[$1]; next} $1 > 5000 && !($2 in omit)' skip file

  5956 127.9.9.0

在这里:

  • 在处理第一个文件skip时,我们将所有的值存储在一个名为omit的数组中。
  • 然后在处理主文件时,我们只需检查$1 > 5000并且$2不存在于数组omit中。
英文:

You can keep value to be skipped in a file called skip like this:

cat skip

-
127.0.0.1
6.5.4.3.2

Then run awk using both files as:

awk 'NR == FNR {omit[$1]; next} $1 > 5000 && !($2 in omit)' skip file

  5956 127.9.9.0

Here:

  • While processing first file i.e. skip we store all the values in an array omit.
  • Then while processing main file we simply check if $1 > 5000 and $2 doesn't exist in array omit.

答案2

得分: 2

给定input文件:

127.0.0.1
6.5.4.3.2

file文件:

   1365 8.67.53.0.9
   2657 1.2.3.4
   5956 127.9.9.0
  10463 127.0.0.1
  15670 6.5.4.3.2
  17984 -
# 读取input文件并进行参数替换
$ ips=$(< input); ips=${ips//$'\n'/|}; ips=${ips//./[.]};
# 创建用于正则表达式的变量
$ regex="^(-|${ips})$"
# 将正则表达式作为变量传递给awk并运行逻辑
$ awk -v regex="$regex" '$2 !~ regex && $1 > 5000' file
   5956 127.9.9.0
英文:

Given input file:

127.0.0.1
6.5.4.3.2

and file file:

   1365 8.67.53.0.9
   2657 1.2.3.4
   5956 127.9.9.0
  10463 127.0.0.1
  15670 6.5.4.3.2
  17984 -
# read input file and perform parameter substitution
$ ips=$(&lt; input); ips=${ips//$&#39;\n&#39;/|}; ips=${ips//./[.]};
# create variable for regex
$ regex=&quot;^(-|${ips})$&quot;
# pass regex to awk as variable and run logic
$ awk -v regex=&quot;$regex&quot; &#39;$2 !~ regex &amp;&amp; $1 &gt;5000&#39; file
   5956 127.9.9.0

huangapple
  • 本文由 发表于 2023年8月9日 01:42:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76862007.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定