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

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

このコマンドを使用してファイル内の10000以下のすべての項目を検索しようとしていますが、この不完全な検索文字列は10000以上の項目に対して機能する可能性がありますsedsed

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操作は、0から9の範囲の数字で始まり、1から4の範囲の長さを持つ行を見つけるように機能します。この部分を実行するsed記号です"/^[0-9]\{1,4\}[^0-9][^0-9]最後の記号は0から9以外の文字を表します。これにより、sedより長い数字内で部分文字列が一致するのを防ぐことができます。

\|1000010000は、前の文字列の残りの部分に比べてわずかにユニークであるため、一致します。尾は印刷結果を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削除されます。並んでいれば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

関連情報