grep
後でコマンドまたはhead
他のコマンドに渡される前のコマンドの一部を変更するには、常にコマンドラインで矢印を上に向ける必要があることに気づきました。
簡単な例を挙げましょう。dmesg
指定された文字列を検索し、その文字列の最後の5つの項目のみを検索します。
私はそうします:
dmesg | grep -i USB | tail -n 5
ただし、検索語や検索中のコンテンツまたはソースを変更するには、カーソルがその行の対応する部分に戻るまで待ちます。上記の例を次のように表現できるように行末に移動したいと思います。 (私はこれが間違っていることを知っています。)
tail -n 5 < dmesg | grep -i USB
(それで検索できますsda
)
私が言ったように、これは粗いたとえば、私がやりたいことを提案しますが、実際には私がやりたいことではありません。これはdmesg
、and の使用に関するものではなく、これらのプログラム間でやり取りする方法や、「変数」を最後に置く方法に関するものです。grep
tail
これは、DNSクエリの検索時間を取得することによってより詳細に説明できます。
dig google.com | grep msec
google.com
(他のドメインをテストできるように最後に移動します)
grep msec < dig google.com
繰り返しますが、悪い例です。私がもっと話すのは、複数のプログラム間で入力/出力が流れる場合です。
私はパイプとリダイレクトについて基本的にのみ理解していることを認めます。これは次のように要約できます。
- パイプ(
|
)stdout
あるプログラムの入力をstdin
別のプログラムの入力として使用する - リダイレクト(
>
)プログラムをインポートしてstdout
ファイルに入力します(余談:私が考えることができる唯一の確実な場所ではなく、他の場所にリダイレクトできますか?
> /dev/null
または
> /dev/sda
または
> {said file}
しかし、管路プログラム出力はプログラム入力で左から右に進みます。 - リダイレクト(
<
) (私はこれを「入力ファイル」と呼びます)ファイルの内容をインポートし、コマンドラインに入力したように使用します。
ベストアンサー1
(bash、ksh、zsh)をサポートするシェルでは<()
変換できます。
$ cmd1 | cmd2
入力する
$ cmd2 < <(cmd1)
2つはパイプの側面で同じでなければなりません。 (ただし、2つの形式がプロセスグループや信号などを処理する方法には若干の微妙な違いがあると思います。)
コマンドラインの編集をより良くするには、シェルツールを確認することをお勧めします。たとえば、bashを使用すると、set -o vi
viに似たショートカットを使用したり、vim
より効率的に編集コマンドに直接切り替えたりできます。set -o emacs
emacsショートカットはデフォルトで使用されます(man bash
詳細についてはreadlineを検索してください(/readline
))。