将参数传递给管道中使用的if条件



我正试图编写一个从文件中提取数据的脚本"nohup.out";使用tail-f并在条件下执行dig命令。

#!/bin/bash
nohup proxychains firefox
tail -f nohup.out | xargs if [[ {} == *"denied"* ]] 
    then
        dig -x `cut -d '-' -f 6 {} | cut -d ':' -f 1`&;
    fi

nohup.out的输出为

|S链|-<gt-10.1.1.16:80-<gt<gt-93.184.220.29:80-&lt--拒绝

|S链|-<gt-10.1.1.16:80-<gt<gt-93.184.220.29:80-&lt--拒绝

|S链|-<gt-10.1.1.16:80-<gt<gt-216.58.209.77:443-<gt<gt-OK

|S链|-<gt-10.1.1.16:80-<gt<gt-46.28.247.89:443-<gt<gt-OK

使用以下命令,我可以提取IP进行反向DNS查找。

cut -d '-' -f 6 | cut -d ':' -f 1

我找不到一种方法将论点传递给cut-and-if命令。

您需要的是将if语句转换为bash的参数。做一个简单的转换,假设问题中的代码有机会工作,你会得到:

tail -f nohup.out |
xargs -I '{}' bash -c "if [[ {} == *"denied"* ]]; then dig -x $(cut -d '-' -f 6 {} | cut -d ':' -f 1) & fi"

这与nohup执行for循环所需的基本处理方法完全相同——您需要一个shell来运行内置命令。请参阅为什么我不能将Unix nohup与Bash for循环一起使用?对于完全类似的情况。

然而,经过进一步思考,您希望剪切作为IP地址的字符串,而不是将其作为名称的文件,因此该命令需要将该字符串回显到cut命令中。为了正确执行子命令,您还必须竭尽全力;在$(…)$之前需要一个反斜杠,如果坚持使用`…`表示法,则在每个反斜杠之前都需要反斜杠,并使用反斜杠双引号来保护字符串中的尖括号。

tail -f nohup.out |
xargs -I '{}' bash -c "if [[ '{}' != *denied* ]]; then echo dig -x "$(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1)" & fi"

现在我们需要讨论条件和两个cut命令的使用(以及一般的脱发(。您可以使用:

tail -f nohup.out |
grep -v denied |
xargs -I '{}' bash -c "echo dig -x $(echo '{}' | cut -d '-' -f 6 | cut -d ':' -f 1) &"

或者,更明智地说:

tail -f nohup.out |
awk -F '[-:]' '/denied/ { next } { print "dig -x " $7 " &" }' |
sh -x

或者无数其他方法中的任何一种。

awk -F- '!/denied/ {print $6}'

在由-分隔的场中分割每个输入行、忽略与denied匹配的行并提取剩余行中的第6场。以你为例,它输出:

216.58.209.77:443
46.28.247.89:443

最新更新