Linux 脚本 bash |如何粘贴到一行

Linux 脚本 bash |如何粘贴到一行

我有一些文本文件,如下所示:

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)"

这里command1command2正在运行。它们的标准输出连接在一起(中间有一个空格,因为它们之间有一个空格)。结果放入 的参数 1 中commond4。的标准 outcommand3用作 的参数 2 command4。然后command4就被执行了。

如果command4echo,则参数之间用空格连接,并发送到标准输出。

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 命令在字符串末尾附加的尾随换行符)。

相关内容