次のテキストファイルがあります。
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
実行されました。
そうであれば、引数は空白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
しかし、動作しないオリジナルスクリプトの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オプションを追加しました)。