英文:
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.1
或 6.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 arrayomit
. - Then while processing main file we simply check if
$1 > 5000
and$2
doesn't exist in arrayomit
.
答案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=$(< input); ips=${ips//$'\n'/|}; ips=${ips//./[.]};
# create variable for regex
$ regex="^(-|${ips})$"
# pass regex to awk as variable and run logic
$ awk -v regex="$regex" '$2 !~ regex && $1 >5000' file
5956 127.9.9.0
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论