質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

434閲覧

コマンド実行結果をファイルに挿入したい

hap_cmd

総合スコア3

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/04/04 07:28

Linux環境で
下記のようなip.txtをforでのワンライナーで回して、
このIPアドレスがどこのグループに所属しているかを調べるコマンド実行
(check.pyというプログラム名)して、そのコマンド実行結果を
ip.txtの3列目にタブ区切りで挿入することが目的です

既存のファイル内にコマンド結果を挿入するためのはどのような術がありますか
ご教授ください

for N in `cat /home/test/ip.txt|awk '{print $2}'|sort|uniq` ; do /usr/local/sbin/check.py $N ;done

ip.txtの中身

4 123.123.123.123 [所属グループを挿入したい] 5 123.123.123.124 [所属グループを挿入したい] 1 123.123.123.125 [所属グループを挿入したい]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/04/04 09:54

既存のファイルはそのままで、新しいファイルを作るのが一般的かと。しかも sort | uniq してるし…。
otn

2022/04/04 13:28

sort | uniq してなければ単純にできますが、sort | uniq している意図は何でしょうか?
hap_cmd

2022/04/05 02:14

otnさま ありがとうございます ip.txtは重複するものがありますのでユニークしてカウントしています check.py実行後ユニークしてカウントすることで問題はないと思います sort | uniq しない場合での手法を教授いただけますと幸いです
guest

回答2

0

sort | uniq しない場合での手法を教授いただけますと幸いです

ということなので。

入力ファイルは2列だけだと仮定して、

sh

1while read a b;do printf "$a\t$b\t`/usr/local/sbin/check.py $b`\n";done < /home/test/ip.txt

投稿2022/04/05 02:23

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hap_cmd

2022/04/07 02:19

ご教授 ありがとうございました
guest

0

ベストアンサー

元の ip.txt は 2 列構成で以下の様になっているものと仮定します。

1 123.123.123.125 2 123.123.123.123 3 123.123.123.124 4 123.123.123.123 5 123.123.123.124 6 123.123.123.125

GNU sed コマンドに入力する replace command 文字列(s/.../.../)を生成します(変換テーブルに相当するモノ)。

bash

1for N in $(cat ip.txt | awk '{print $2}' | sort -u) 2do 3 printf 's/%s$/&\t%s/\n' $N $(/usr/local/sbin/check.py $N) 4done | sed -i -f - ip.txt

実行後

bash

1$ cat ip.txt 21 123.123.123.125 Group_C 32 123.123.123.123 Group_A 43 123.123.123.124 Group_B 54 123.123.123.123 Group_A 65 123.123.123.124 Group_B 76 123.123.123.125 Group_C

※ GNU sed の -i(inplace) オプションを使いますのでご注意ください。

投稿2022/04/04 12:30

編集2022/04/04 12:34
melian

総合スコア19803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hap_cmd

2022/04/05 03:08

ありがとうございます コマンド実行しましたところ、元ファイルにコマンド実行結果が追記されないようでした sed前までの実行処理では下記の結果が出るようですので とりあえずは、これを追記させるには どのような手法があるのでしょうか 恐縮ですが、ご指南いただけますと幸いです s/123.123.123.162$/& A/ s/123.123.123.163$/& B/ s/123.123.123.164$/& A/ s/123.123.123.165$/& B/ s/123.123.123.166$/& C/
hap_cmd

2022/04/05 03:23

試しに、awk '{print $2 >> "ip.txt"}'とすると、ファイルの最終行に追記されてしまいました ip.txtの3列目に追記させる場合は、どのような手法となるのでしょうか お手数お掛けします
melian

2022/04/05 04:06

sed に -E オプションを付けるとどうなりますでしょうか。 | sed -E -i -f - ip.txt
hap_cmd

2022/04/05 04:18

| sed -E -i -f - ip.txt こちらも結果が変わらずでした ip.txtはタブ区切りとなっているのですが、それが関係するのでしょうか お手数お掛けします
melian

2022/04/05 04:25

タブ区切りなのは問題ないかと思います。考えられるのは、行末(IPアドレスの後ろ)にスペースやタブが入っているなどです。もしくは、そちらでお使いの sed が GNU 版ではないのかもしれません。
hap_cmd

2022/04/05 04:37

ご教示ありがとうございます ご指摘のいただきましたように行末にスペース・タブが入っていたようでした 大変失礼しました ご教授ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問