テキスト文字列を指定して行数を指定する代わりに、ファイルの最後の行から最初の行までそのテキストを検索し、その後の行全体または指定された数を表示できるtailに似たLinuxコマンドはありますか? ?キャプチャしたいログの末尾にある内容は、0行から10行の間で異なる可能性があるため、10行でなければコピーしたログファイルを理解できなくなります。
tailのマニュアルページでは、行またはバイトを指定する機能のみを表示できます。
答え1
テキスト文字列を指定し、それに続くすべての行を表示します。
使用できる偽データは次のとおりです。
$ seq 100 > input
...ここで文字列 "90"を検索し、その後のすべての内容を表示します($
ファイルの最後まで)。
$ sed -n '/90/,$p' input
90
91
92
93
94
95
96
97
98
99
100
より柔軟なソリューションが必要な場合は、変数を使用してsed引用符を変更します($
sedの場合はシェルからエスケープ処理)。
$ t=96
$ sed -n "/$t/,\$p" input
# or
$ sed -n /$t/,\$p input
96
97
98
99
100
答え2
次のコマンドを使用できますretail
。https://github.com/mwh/retail
出力を開始および停止するための正規表現をサポートしているため、次のようなものが必要になる場合があります。
retail -r STARTPATTERN mylogfile
retail -r STARTPATTERN -u ENDPATTERN -f mylogfile
この-r
オプションは通常、目的のパターンの最後のインスタンスを明示的に検索します。
また見なさい:https://superuser.com/questions/270529/monitoring-a-file-until-a-string-is-found
以下は、Apacheが複数回再起動したApacheエラーログを使用してretail
最後の再起動部分のみを抽出する例です。
$ grep -c "Apache.*resuming normal operations" /var/web/logs/error.log
8
$ retail -r "Apache.*resuming normal operations" /var/web/logs/error.log
[Wed Jul 6 17:12:55.534567 2016] [mpm_prefork:notice] [pid 17965] AH00163: Apache/2.4.4 (Unix) OpenSSL/1.0.1e configured -- resuming normal operations
[Wed Jul 6 17:12:55.534582 2016] [mpm_prefork:info] [pid 17965] AH00164: Server built: Mar 26 2016 12:22:17
[Wed Jul 6 17:12:55.534598 2016] [core:notice] [pid 17965] AH00094: Command line: '/usr/local/apache2/bin/httpd'
あるいは、正規表現を使用して、"(SIGTERM.* shutting down|SIGHUP.*restart)"
最後の終了または再起動の試み以降のすべての内容を表示できます。
答え3
一致するたびに特定の数のコンテキスト行を表示するフラグがgrep
ある場合は、次のことができます。-A
grep -A 10 'pattern' logfile | less
答え4
完璧にするために、以下を使用しますawk
。この特定のタスクには必要ありませんが、非常に強力なツールであり、解決に適した種類の問題です。
awk '/pattern/{x=1}x{print}'
x
パターンが見つかった場合は変数を設定し、x
trueの場合は1行を印刷します。から始めますので参考にしてください最初パターンの出現。