以下のように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つの変数が必要です。私はこの問題についてしっかりとした立場に立っています。