![在 shell 脚本中将值传递给 awk](https://linux22.com/image/185073/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%B0%86%E5%80%BC%E4%BC%A0%E9%80%92%E7%BB%99%20awk%20.png)
所以我有我的目标数组,它是从文件中读取的一堆IP,现在我试图cat一个包含我的IP和ssh命令结果的文件,但是因为我在每个目标上尝试3个不同的密码,我将得到2个拒绝和一项工作预定结果。所以我想,我将检查是否为特定结果安排了作业,然后我将打印“$ip OK,如果没有,那么我将打印“$ip failed”,这是我所拥有的:
#!/bin/bash
for ip in "${targets_array[@]}"
do
cat "$output_file" | awk -v ip="$ip" '/$ip/&&/job/ {result="OK"} END {
!result?result="failed":result=result;}'
done
我想做的伪代码: 1.cat 来自文件的输出文件行,您可以在其中找到所需的 ip 和单词“job” 2.1.如果找到它打印附加到字符串变量“$ip OK” 2.2 如果没有找到则附加到字符串变量“$ip failed” 3. 使用存储在变量中的结果覆盖输出文件
但是当我在调试模式下运行它时,我发现该值从未传递给 awk 脚本。我怎样才能通过呢?
+ awk -v ip= '/$ip/&&/job/ {result="OK"} END {
!result?result="failed":result=result;}'
我正在剪切的文件:
unwantedString 124.131.8010 Permission denied, please try again.
unwantedString 125.124.90.134 Permission denied, please try again.
unwantedString 145.120.100.8 Permission denied, please try again.
unwantedString 145.101.100.158 Permission denied, please try again.
unwantedString 124.131.80.2 Permission denied, please try again.
unwantedString 125.124.90.134 job 32 at 2020-12-16 23:30
unwantedString 145.120.100.8 Permission denied, please try again.
unwantedString 145.101.100.158 job 27 at 2020-12-16 23:30
unwantedString 124.131.8010 Permission denied, please try again.
unwantedString 125.124.90.134 Permission denied, please try again.
unwantedString 145.120.100.8 Permission denied, please try again.
unwantedString 145.101.100.158 Permission denied, please try again.
答案1
首先这里有一个错误:!#/bin/bash
#!/bin/bash
。
那么ip=$ip
应该是ip="$ip"
。
然后,要使用变量,您可以在不带美元符号的情况下调用它ip
,但不能在应该调用的模式区域内调用它$0 ~ ip
。
按照您的输出:
#!/bin/bash
for ip in "${targets_array[@]}"
do
ip="$ip"
awk -v ip="$ip" '{if ( $2 == ip && $3 == "job" ) {print $2 " success"} else {print $2 " failed"}}' output_file > out
done