私が知ってよく使うもの
less
+
コマンドラインで - パラメータを使用してコマンドを追加する方法が好きです。私は次のような即時検索が好きです。
$ less +/DHCP /var/log/syslog
# result: syslog at the point of the first occurrence of DHCP
しかし、私はまた、次の出力に従うように設定したいと思います。
$ less +F /var/log/syslog
# result: a syslog that follows the file, very much like tail -f would.
私は何を使用したいですか?
でも、たまには両方持っていたくなる時もあります。しかし、どうすればいいのかわかりません。
$ less +F +/DHCP /var/log/syslog
# result: "Pattern not found" - it will actually bunch up both things to one string.
最初に押す必要なく自動的にフィルタリングする方法を教えてくださる方、ボーナスポイントをいただける方ですか?
$ less +\&DHCP /var/log/syslog
# result: "please press enter" after which the filtering search _is_
# running correctly. I would love to get rid of that extra <enter>
edit2:興味深いことに、次のものを組み合わせることができます。
$ less +?DHCP +G /var/log/syslog
# result: jumps to the end and reverse-searches for DHCP
# But I have to press enter (which I'd like to avoid)
しかし、私はこれを行うことはできません:
$ less +G +?DHCP /var/log/syslog
# this is being bunched up to ?DHCPG and subsequently not found.
だとしたら、順番が大事だそうです。すべての文字列が1つの文字列として解釈されますか?
バージョン情報
編集するこれは私のシステムにはあまりインストールされていないバージョンですが、必要に応じて別のバージョンをインストールしたいと思います!
$ less --version
less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman
[...]
答え1
後であなたのコメントによると、あなたの質問の最初の部分を理解していないようです。私には、作品を使用して更新されたファイルに表示される新しいインスタンスをless +F +/pattern logfile
強調し続けます。pattern
質問のボーナス部分については、次のいずれかのコマンドを試すことができます。
less +\&DHCP$'\n' /var/log/syslog
または
less +\&DHCP^M /var/log/syslog
2番目のコマンドでは、^M
thenを押してビルドします。スクリプトなどを書く必要がない限り、lessの開始時にEnterキーを押す方が簡単です。Ctrl-V
Enter
答え2
膨大な複雑さの観点から、ラッパーを介して変更可能なクエリに自動的に追跡されますexpect
。
#!/usr/bin/env expect
#
# Sticky search wrapper for less; tails the given file, though with
# input of
# /asdf
# or whatever will search for that new term then re-tail the file.
# Probably needs `less` with (the default) hilight mode enabled.
if {[llength $argv] == 0} {
puts stderr {Usage: $argv0 [searchterm] file}
exit 64
} elseif {[llength $argv] == 1} {
set fname [lindex $argv 0]
set search ""
} else {
set fname [lindex $argv 1]
set search [lindex $argv 0]
}
# FIXME soas to nix any default options (like turning off hilight) and
# on account of LESSOPEN and LESSCLOSE being security risks due to the
# defaults certain vendors set.
foreach ev [list LESS LESSOPEN LESSCLOSE] {
if {[info exists env($ev)]} {
unset env($ev)
}
}
match_max 999
set timeout -1
spawn -noecho less $fname
expect {
# TODO need better way to detect that less didn't fly...
-ex "No such file or directory" { exit }
-re "." { }
default { exit }
}
if {$search ne ""} {
send -- "/$search\r"
}
send -raw "F"
interact {
-echo -re "/(.*)\[\n\r]" {
# send_user "DBG search $interact_out(1,string)"
send -raw "\003\r/"
send -- $interact_out(1,string)
send -raw "\rF"
}
}
答え3
私が理解しているように、私は/var/log/syslog
ファイルを読んで「DHCP」を含むすべてのエントリを見て、新しいエントリが現れると見続けたいと思います。これが正しい場合は、達成することができますtail -f /var/log/syslog | grep DHCP
。あなたの要求の解釈が間違っている場合、私はどこで間違っていますか?