5

4 列 (ヘッダーなし) のテキスト ファイルから行を読み取る bash スクリプトがあります。行数は最大 4 行以下です。各行の単語はスペース文字で区切られています。

ab@from.com   xyz@to.com;abc@to.com   Sub1   MailBody1
xv@from.com   abc@to.com;poy@to.com   Sub2   MailBody2
mb@from.com   gmc@to.com;abc@to.com   Sub3   MailBody3
yt@from.com   gqw@to.com;xyz@to.com   Sub4   MailBody4

現在、私はファイルを解析しており、各行を取得した後、各行の各単語を変数に格納し、mailx を 4 回呼び出しています。以下のロジックに対するエレガントな awk/sed ソリューションがあるかどうか疑問に思っています。

  • 行の総数を見つける
  • while read $line、各行を変数に格納する
  • 各行を などとして解析i=( $line1 )j=( $line2 )ます
  • ${i[0]}、、${i[1]}などとして各行から値を取得 ${i[2]}${i[3]}ます
  • 電話mailx -s ${i[2]} -t ${i[1]} -r ${i[0]} < ${i[3]}
  • 次の行を解析して呼び出すmailx
  • 行がなくなるか、最大 4 行に達するまでこれを行います。

awk または sed は、上記の反復/ループ ロジックに対する洗練されたソリューションを提供しますか?

4

2 に答える 2

5

これを試してみてください:

head -n 4 mail.txt | while read from to subject body; do
    mailx -s "$subject" -t "$to" -r "$from" <<< "$body"
done
  • head -n 4テキスト ファイルから最大 4 行を読み取ります。
  • read1 行から複数​​の変数を読み取ることができるため、読みやすくするために名前付き変数を使用できます。
  • <<<ではなく、おそらくリダイレ​​クトに必要なものです<。おそらく。
于 2011-07-20T03:57:53.770 に答える
2

上記の while ループは、ファイル内のテキスト行を表示する方法を細かく制御できる場合、sed や awk の単純な代替手段としてうまく機能します。read コマンドは、-d フラグを使用して、指定された区切り文字も使用できます。

別の簡単な例:

mysql を使用してユーザーとホストのリストを取得し、次のようなテキストでファイル /tmp/userlist に入れました。

user1 host1
user2 host2
user3 host3

これらの変数を mysql コマンドに渡して、これらのユーザーとホストの許可情報を取得し、/tmp/grantlist に追加します。

cat /tmp/userlist | while read user hostname;
do
  echo -e "\n\nGrabbing user $user for host $hostname..."
  mysql -u root -h "localhost" -e "SHOW GRANTS FOR '$user'@$hostname" >> /tmp/grantlist
done
于 2012-05-18T20:18:15.240 に答える