比較性能テスト受け入れられた回答

比較性能テスト受け入れられた回答

以下のようにabdというテキストファイルがあります。

48878 128.206.6.136
34782 128.206.6.137
12817 23.234.22.106

テキストからIPアドレスを抽出して保存したいです。変えるそして他の目的のために。

試してみました。

for line in `cat abd`
do

ip=`grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $line`

echo $ip

done

以下のようにエラーが発生します。

grep: 34782: No such file or directory

grep: 128.206.6.137: No such file or directory

grep: 12817: No such file or directory

grep: 23.234.22.106: No such file or directory

ここで何が間違っているのかわかりません。どんな助けでも大変感謝します。

ベストアンサー1

最初はほぼ当たった。答えは特定のケースに適用されますが、エラーが発生するのは、変数ではなくファイルを検索するためにawk使用しようとするためです。grep

また、正規表現を使用するときは常にgrep -E安全に使用してください。また、バックティックは使用されなくなりました$()

grepサポートされているシェルで変数を使用する正しい方法ここにある文字列次の3つは入力リダイレクトを使用しているため、<コマンドgrep$ip変数)は実際には次のようになります。

ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"

whileファイルを検索する場合は1行ずつ移動することが保証されるため、常にループを使用しますが、for奇妙な間隔がある場合は通常ループが発生します。また、cat入力リダイレクトに代わる役に立たない使用も実装しました。この試み:

while read line; do
  ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
  echo "$ip"
done < "abd"

また、使用しているOSやバージョンが何であるかはわかりませんが、grep過去にこのコマンドを使用するたびに中括弧の前のエスケープ文字は通常必要ありません。引用符なしでバックティックなしで使用または使用することによって発生する可能性がありますgrep -E。わかりません。それを使用または使用せずに試してみて、何が起こっているのかを確認できます。

forループを使用するのかwhileループを使用するのかは、特定の状況にどのループが適しているのか、そして実行時間が最も重要であるかによって異なります。 OPは、各IPアドレスに別々の変数を割り当てようとするのではなく、ループ自体で使用できるように、行内の各IPアドレスに変数を割り当てたいと思います。この場合、$ip繰り返しごとに1つの変数が必要です。私はこの問題についてしっかりとした立場に立っています。

おすすめ記事