3

通常、何かを実行して特定の出力行を確認したい場合は、次のようなことができます。

./a.out | grep IHaveThisString

しかし、IHaveThisStringが毎回変更されるため、最初に実行し、出力を監視してその特定の実行でIHaveThisStringが何であるかをキャッチし、それをgrepする必要がある場合はどうなりますか?ファイルにダンプして後でgrepを実行することはできますが、バックグラウンドで処理してからフォアグラウンドに戻し、元に戻すことはできますが、現在はいくつかのgrepにパイプされていますか?似たようなもの:

./a.out
Ctrl-Z
fg | grep NowIKnowThisString

ただ疑問に思う。

4

4 に答える 4

2

いいえ、他の方法で保存しなかった場合にのみ、画面バッファにあります。

于 2012-07-11T21:01:18.037 に答える
1

それはあなたが必要とするものは少し奇妙ですが、あなたはそれを次のように行うことができます:

  • script最初にセッションに入る必要があります。
  • 次に、通常はシェルを使用します。
  • 次に、プログラムを開始して中断します。
  • 次に、ファイルを実行greptypescriptます。

例:

$ script
$ ./a.out
Ctrl-Z
$ fg 
$ grep NowIKnowThisString typescript
于 2012-07-11T21:08:45.997 に答える
1

短い形式:これを行うことはできますが、事前に行う必要があることを知っておく必要があります。事後にインタラクティブに配置できるものではありません。


文字列が何であるかを判断するためのスクリプトを作成します。より良い使用例を示すために、出力形式のより詳細な例が必要ですが、最初の行全体がフィルターターゲットであるという些細な場合の例を次に示します。

run_my_command | { read string_to_filter_for; fgrep -e "$string_to_filter_for" }

を必要な数のコマンドに置き換えてread string_to_filter_for、ターゲット文字列が何であるかを判断するのに十分な入力を読み取ります。これは、必要に応じてループになる可能性があります。

たとえば、出力に次のものが含まれているとします。

Session id: foobar

その後、を含む行をgrepしますfoobar

...次に、次のスクリプトをパイプ処理できます。

re='Session id: (.*)'
while read; do
  if [[ $REPLY =~ $re ]] ; then
    target=${BASH_REMATCH[1]}
    break
  else
    # if you want to print the preamble; leave this out otherwise
    printf '%s\n' "$REPLY" 
  fi
done
[[ $target ]] && grep -F -e "$target"

フィルタターゲットを手動で指定する場合は、フィルタの内容を使用して作成されているファイルをループチェックし、後でgrepを起動するときにそれを使用することで実行できます。

于 2012-07-11T21:12:12.060 に答える
1

sedの代わりになどのストリームエディタを使用できますgrep。これが私が意味することの例です:

$ cat list 
Name to look for: Mike

Dora 1
John 2
Mike 3
Helen 4

ここで、最初の行で検索する名前を見つけて、それを探しますgrepsed次に、コマンドを次の場所にパイプします。

$ cat list | sed -ne '1{s/Name to look for: //;h}' \
> -e ':r;n;G;/^.*\(.\+\).*\n\1$/P;s/\n.*//;br'
Mike 3

注:sedそれ自体はパラメーターとしてファイルを受け取ることができますが、テキストファイルを操作していないため、このように使用します。

もちろん、ケースに合わせてコマンドを変更する必要があります。

于 2012-07-11T21:16:14.637 に答える