【发布时间】:2017-03-21 03:41:06
【问题描述】:
在我的情况下,如何将参数传递给 bash 中的函数或循环?字段分隔符将是空格和下一行(\n)。目标是从日志文件中获取所有路由命令,然后重新应用相同的命令,但在应用之前将其删除。
文件.log
Mon Nov 7 10:55:28 2016 bla bla bla
Mon Nov 7 10:55:28 2016 bla blabla bla
Mon Nov 7 11:19:27 2016 /sbin/route add -net 123.123.123.0 123.123.123.104 255.255.240.0
Mon Nov 7 11:19:27 bla bla bla
Mon Nov 7 11:19:27 2016 /sbin/route add -net 111.111.111.111 192.168.1.1 255.255.255.255
Mon Nov 7 11:19:32 2016 /sbin/route add -net 4.4.2.2 224.224.224.1 255.255.255.255
Mon Nov 7 11:19:32 bla blabla bla
Mon Nov 7 11:19:32 2016 /sbin/route add -net 222.222.222.222 224.224.224.1 255.255.255.255
Mon Nov 7 11:20:21 bla blabla bla
Mon Nov 7 11:20:21 bla bla bla
Mon Nov 7 11:20:23 bla bla bla
以下是从日志文件中提取路由命令添加,
sed -n 's/^.*\(\/sbin\/route\ add \-net\)/\1/p' /path/to/file.log | awk '!seen[$0]++'
这是我正在尝试的 bash 函数,
#!/bin/bash
add_routes() {
$1 delete $3 $4 $5 $6 #expecting: eg: /sbin/route delete -net 4.4.2.2 224.224.224.1 255.255.255.255
$@ #expecting: eg: /sbin/route add -net 4.4.2.2 224.224.224.1 255.255.255.255
}
add_routes $(sed -n 's/^.*\(\/sbin\/route\ add \-net\)/\1/p' /path/to/file.log | awk '!seen[$0]++')
从上述函数中按顺序执行所需的输出命令(先删除以应用从日志中提取的最新路由网络),
/sbin/route delete -net 123.123.123.0 123.123.123.104 255.255.240.0
/sbin/route add -net 123.123.123.0 123.123.123.104 255.255.240.0
/sbin/route delete -net 111.111.111.111 192.168.1.1 255.255.255.255
/sbin/route add -net 111.111.111.111 192.168.1.1 255.255.255.255
/sbin/route delete -net 4.4.2.2 224.224.224.1 255.255.255.255
/sbin/route add -net 4.4.2.2 224.224.224.1 255.255.255.255
/sbin/route delete -net 222.222.222.222 224.224.224.1 255.255.255.255
/sbin/route add -net 222.222.222.222 224.224.224.1 255.255.255.255
从上述函数中,$@ 执行将所有路由命令粘贴在一行中,但失败。并且删除命令(高于 $@ 行)只删除第一条路线。
如果完成工作,任何人都知道如何通过函数或for loop 获得所需的输出?谢谢!
【问题讨论】:
标签: bash macos function for-loop sed