
sed
コマンドを使用してファイル内の 10000 以下のすべてのエントリを検索しようとしていますが、この不完全なsed
検索文字列は 10000 以上のエントリを対象としている可能性があります。
sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile
答え1
次の方法でも実行できます。
$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile
例
次のようなサンプル ファイルがあるとしますlogfile
。
$ seq 9900 10050 | sed 's/$/ /' > logfile
結果、ファイルはlogfile
次のようになります。
$ head -5 logfile
9900
9901
9902
9903
9904
$ tail -5 logfile
10046
10047
10048
10049
10050
sed 's/$/ /'
サンプル ファイルを作成したとき、上記の行のおかげで、これらの各行の後に末尾のスペースが存在します。
上記のsed
コマンドを実行すると次のようになります。
$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile | tail -5
9996
9997
9998
9999
10000
10000 まではすべて取得しますが、それ以上は取得しません。
使い方
上記は、sed
長さが 1 から 4 までの範囲の 0 から 9 の数字で始まる行を検索することで機能します。 の表記はsed
、この部分を実行します。の最後の"/^[0-9]\{1,4\}[^0-9]
表記は、 0 から 9 以外の文字を示します。これにより、より長い数字の部分文字列の一致が停止します。[^0-9]
sed
10000は\|10000
、それまでの文字列と比べて少し独特なパターンなので、これに一致します。末尾の は、結果を印刷するようにp
指示します。sed
代替手段としてgrepを使用する
の使用は、実際には検索に適したツールではありません。代わりに をsed
使用する方がよいでしょう。grep
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900
9901
9902
9903
9904
$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996
9997
9998
9999
10000
上記は、10000 以下の数字の文字列を含むすべての行を検索します。 は、\b
文字列の前または後の境界線を示します。
答え2
Perl を使用すると、これをより簡単かつ読みやすくすることができます。
perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file
答え3
sed '/[0-9]/!d;/10000/q' <log.file
エントリが順番に並んでいる限り、行に数字が含まれていることを指定するだけでよく!
、そうd
でない場合は削除します。行に到達したら、 uit を実行10000
しますq
。ただし、10000 はまだ印刷されます。これは、印刷される最後の行になります。
これをアンカーできれば、さらに良くなります。たとえば、次のように行の先頭にアンカーできます。
sed '/^[0-9]/!d;/^10000/q' <log.file
それはより確実で、より速いことだろう。
しかし、slm が指摘しているように、grep
より高速になります。
答え4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile