以下に示す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
ここで何が悪いのかわかりません。どんな助けでもいただければ幸いです。
あなたはほとんどそれを最初に正しく持っていました。awk
答えはあなたの特定のケースのために良いですが、あなたが使用しようとしていたので、あなたがエラーを受けていた理由は、grep
それが代わりに変数のファイルを探していたかのように。
また、正規表現を使用grep -E
する場合は、安全のために常に使用しています。また、バックティックは非推奨であり、に置き換える必要があると聞いています$()
。
herestringsgrep
をサポートするonシェルを持つ変数への正しい方法は、次の3人で入力リダイレクトを使用することです。したがって、コマンド(変数)は実際には次のようになります。<
grep
$ip
ip="$(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' <<< "$line")"
検索しているファイルの場合、行ごとwhile
に移動することが保証されているため、常にループを使用します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つの変数のみが必要な場合。私はこれに私の銃に固執しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加