したがって、次の行を含むテキストファイルがあります。
http://sg.ovies.m/.ss/ (Status: 200) [Size: 128]
http://sg.mo.v/.dev/ (Status: 200) [Size: 12328]
http://som.b/.hal/ (Status: 200) [Size: 1238]
http://m.cb/.ho/ (Status: 200) [Size: 0]
http://sm.jo/.hK/ (Status: 200) [Size: 0]`
サイズが1から100の間の行だけをgrepしたいと思います。
したがって、出力は次のようになります。
http://sg.ovies.m/.ss/ (Status: 200) [Size: 128]
http://sg.mo.v/.dev/ (Status: 200) [Size: 12328]
http://som.b/.hal/ (Status: 200) [Size: 1238]
grep または awk を使ってこれを行うにはどうすればよいですか?
答え1
Awkを使用すると、次の作業が簡単になります。
awk '{size=$5; sub(/]/, "", size); size=size+0; if (size <= 100 && size >= 1) {print $0 } }' file_to_read.txt
以下をもっと親しみやすいものにしてください。
awk '{
# create a new variable "size".
# items are separated by spaces, we need the 5th item
size=$5;
# remove the trailing "]"
sub(/]/, "", size);
# make sure size is an int
size=size+0;
# Choose rows with seize between 1 and 100
if (size <= 100 && size >= 1) {
# print the whole line
print
}
}' file_to_read.txt
答え2
この:
文字が入力の3つの位置にのみ表示されることを考えると、それをフィールド区切り文字として使用してから、比較のために部分文字列として数字を抽出できます(先行スペースを考慮)。
awk -F':' '{size=substr( $NF,2,length($NF)-2 ); if((size>=1)&&(size<=100)) print }' input.txt
「サイズ:1から100まで」をリクエストしました。ただし、出力例では「サイズが 1 より大きい」と表示されます。その場合、ifステートメントを次のように単純化できます。if(size > 1) print
答え3
次のパターンを使用できます。
grep -E 'Size: (?:100|[1-9]|[0-9]{2})]' test
私はgrepに拡張正規表現構文()を使用し、0から99の値を-E
一致させるように指示しました。100
Size: