我有一些文本文件,如下所示:
k-opp- -l fi -s linux -a BHHHHH7 -d 22.22.222.22 -g ai
k-opp- -l fi -s linux -a BHHHHH8 -d 222.22.22.22 -g ai
k-opp- -l fi -s linux -a BHHHHH9 -d 222.222.22.222 -g ai
我制作了一些脚本:
#!/bin/sh
file=list.txt
while read line
do
echo $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt
$line <checkcon.sh >>somefile.txt
done < "$file"
该脚本ssh
发送到我的机器并运行第二个脚本并获取我需要的一些信息。
这问题输出看起来像:
BHHHHH7
eth: inet 22.22.222.22
BHHHHH8
eth: inet 222.22.22.22
BHHHHH8
eth: inet 222.222.22.222
我想做什么:
BHHHHH7 eth: inet 22.22.222.22
BHHHHH8 eth: inet 222.22.22.22
...continues..
任何人都知道我如何使我的脚本打印成一行。提前致谢 :)
答案1
使用命令替换:
echo "$(echo $line |grep -o -P '(?<=-a).*(?=-d)' ) $(echo abc)" >> some_file_to_append_next_line_to
您必须更改第二部分,我更改了它,以便可以对其进行测试,而无需从数据运行命令。
基本形式是:
command4 "$(command1) $(command2)" "$(command3)"
这里command1
和command2
正在运行。它们的标准输出连接在一起(中间有一个空格,因为它们之间有一个空格)。结果放入 的参数 1 中commond4
。的标准 outcommand3
用作 的参数 2 command4
。然后command4
就被执行了。
如果command4
是echo
,则参数之间用空格连接,并发送到标准输出。
PS 请小心从数据运行命令,它可能会让您容易受到攻击。任何提供数据的人都可以运行他们希望的任何命令。
答案2
既然你有成对的线,为什么不用sed
-one-liner 将它们连接起来呢?
只需通过管道输出...
sed '$!N;s/\n/ /'
因此将您的原始脚本更改为:
#!/bin/sh
file=list.txt
cat "$file" | while read line
do
echo $line |grep -o -P '(?<=-a).*(?=-d)'
$line <checkcon.sh # This line can not possibly work...
done | sed '$!N;s/\n/ /' >>somefile.txt
但是,由于原始脚本中的一行无法工作,这会产生一些失败:
me@home:~$ ./script.sh
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
./script.sh: 6: ./script.sh: cannot open checkcon.sh: No such file
./script.sh: 6: ./script.sh: k-opp-: not found
me@home:~$ cat somefile.txt
BHHHHH7 BHHHHH8
BHHHHH9
您可能应该将$line
其作为参数传递给checkcon.sh
: checkcon.sh "$line"
。
当然,checkcon.sh
这里也缺少 的输出。
checkcon.sh
使用在标准输出上生成输出的虚拟对象,事情会按预期工作:
me@home:~$ ./script.sh
me@home:~$ cat somefile.txt
BHHHHH7 eth: inet 22.22.222.22
BHHHHH8 eth: inet 222.22.22.22
BHHHHH9 eth: inet 222.222.22.222
答案3
尝试使用echo -n $line |grep -o -P '(?<=-a).*(?=-d)' >>somefile.txt
(我添加了 -n 选项,它应该删除 echo 命令在字符串末尾附加的尾随换行符)。