sedコマンドを使用して、テキストファイル内の10000以下のエントリを検索します。

sedコマンドを使用して、テキストファイル内の10000以下のエントリを検索します。

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

関連情報