このコマンドを使用してファイル内の10000以下のすべての項目を検索しようとしていますが、この不完全な検索文字列は10000以上の項目に対して機能する可能性がありますsed
。sed
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
より長い数字内で部分文字列が一致するのを防ぐことができます。
\|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
削除されます。並んでいれば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