将参数传递给管道

时间:2015-09-17 04:37:52

标签: bash if-statement pipe

我正在尝试编写一个脚本,该脚本使用tail -f从文件“nohup.out”中提取数据并在条件下执行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链| - <> -10.1.1.16:80-<><> -93.184.220.29:80-< - 否认

     

| S链| - <> -10.1.1.16:80-<><> -93.184.220.29:80-< - 否认

     

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

     

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

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

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

我无法找到将参数传递给cut和if命令的方法。

2 个答案:

答案 0 :(得分:1)

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

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

这与for执行nohup循环所需的基本处理完全相同 - 您需要一个shell来运行内置命令。有关完全类似的情况,请参阅Why can't I use Unix nohup with Bash for loop?

但是,在进一步思考时,您希望剪切作为IP地址的字符串,而不是将其作为名称的文件,因此该命令需要将字符串回显到cut命令中。你也必须撕裂你的头发才能正确执行子命令;如果您坚持使用$表示法,并且使用反斜杠双引号来保护,则需要在$(…)的{​​{1}}之前或者在每个反向标记之前使用反斜杠字符串中的尖括号。

`…`

现在我们需要讨论条件的使用和两个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) &"

或任何其他无数方法。

答案 1 :(得分:0)

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

将每个输入行拆分为由-分隔的字段,忽略匹配denied的行并提取剩余行的第6个字段。以你为例,它输出:

216.58.209.77:443
46.28.247.89:443