我正在尝试做以下事情:
文件1:
x.x.x.5
x.x.x.6
文件2:
router
switch
尝试循环遍历这两个文件来创建两个附加文件,每个文件在 file2 中的名称如下:
ping路由器
sudo /sbin/mtr -rn -c 30 --interval 1 -Z 1 x.x.x.6 | sed 's/Start: //g' | sed -e '2,$ s/^/ /'
ping_交换机
sudo /sbin/mtr -rn -c 30 --interval 1 -Z 1 x.x.x.7 | sed 's/Start: //g' | sed -e '2,$ s/^/ /'
脚本:
for x in $(cat file1); do; for z in $(cat file2); do; echo "sudo /sbin/mtr -rn -c 30 --interval 1 -Z 1 $x | sed 's/Start: //g' | sed -e '2,$ s/^/ /'" >>mtr_$z.sh; done;done
^^ 它创建了两个文件,但包含两个 IP
我怎样才能实现上述目标?
和
bash
:输出:
awk
是另一种可能性。如果我理解你想要完成什么,你可以使用如下的一行代码:其中的内容
file1
缓冲在数组中a[]
,然后在传递过程中,file2
命令sudo
由您提供的文本和的内容组成,file1
使用的内容file2
创建"mtr_name.sh"
输出文件。转义只是用于在中\x27
创建命令的单引号的 ASCII 代码。请注意,所有字符串和生成的文件名都是使用中的字符串连接形成的。它只是将相邻的字符串连接在一起。sudo
awk
awk
以多行形式(更容易阅读)将是:
生成的 mtr_router.sh 和 mtr_switch.sh
和
将每个文件读入数组:
[可选] 显示数组的内容:
循环遍历一个数组的索引并生成所需的输出:
结果:
上述内容的变化...
将第一个文件读入数组:
使用计数器(
i
)来跟踪arr1[]
索引,同时使用while/read
循环处理第二个文件:结果:
使用输入重定向,您可以在不同的文件描述符上打开两个文件,并告诉两个单独的
read
命令从每个文件读取。(您可以对一个文件使用标准输入,但为了对称,我将在专用描述符上打开两个文件。)3<
file1
在文件描述符 3 上打开,<&3
并将文件描述符 3 复制到标准输入,这样就可以read
从文件描述符 3 而不是标准输入读取。每次执行时read x 3< file1
都会重新打开,而不是不断从同一个打开的文件中读取。(我从 3 开始,因为标准输入、标准输出和标准错误分别使用文件描述符 0、1 和 2)file1
read
对一个文件使用标准输入看起来像