Linuxスクリプトbash 1行に貼り付ける方法

Linuxスクリプトbash 1行に貼り付ける方法

次のテキストファイルがあります。

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マイコンピュータに送信され、2番目のスクリプトを実行して必要な情報を取得します。

これ質問出力は次のとおりです。

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行で印刷する方法を知っている人がいます。よろしくお願いします:)

答え1

コマンド置換の使用:

echo "$(echo $line |grep -o -P '(?<=-a).*(?=-d)' ) $(echo abc)" >> some_file_to_append_next_line_to

2番目の部分を変更する必要があります。データからコマンドを実行せずにテストできるように変更しました。

基本的な形式は次のとおりです。

command4 "$(command1) $(command2)" "$(command3)"

ここでcommand1走っていcommand2ます。標準出力は一緒に接続されます(それらの間にスペースがあるため、スペースにスペースがあります)。結果はパラメータ1に配置されますcommond4。標準出力はcommand3パラメータ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

しかし、動作しないオリジナルスクリプトの1行が原因でいくつかのエラーが発生します。

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(echoコマンドが文字列の末尾に追加する末尾の改行文字を削除する-nオプションを追加しました)。

関連情報