コマンドを一緒にパイピングする良い例は何ですか?


33

誰かがコマンドラインでパイプの概念を学ぶのを手伝っていたら、どの例を使用しますか?実際に出てきた例は次のとおりです。

cat whatever.txt | less

それは最良の例ではないように感じます。つまり、1つのステップしかないからです。良いが、基本的な使用は何ですか|何ですか?

理想的には、ここで紹介する例では、独立して実行でき、一緒にパイプで表示できる出力自体を備えたプログラムを使用します。


3
あなたの例は本当にそれほど良くはありません-それは基本的に猫の役に立たない賞のノミネートです。
maxschlepzig

@maxschlepzigあなたが間違っているということではありませんが、あなたはどちらかといえばあまり役に立ちません。正常に機能するcatため、その必要はありませんless whatever.txt
ボラM.アルパー

回答:


34

実際のシナリオに基づいて、やや複雑な例を紹介します。

問題

コマンドconkyがデスクトップで応答を停止し、手動で強制終了したいとしましょう。Unixを少し知っているので、コマンドを実行する必要があることを知っていkill <PID>ます。PIDを取得するには、psまたはtopまたは私のUnixの分布が私に与えているものは何でもツール。しかし、1つのコマンドでこれを行うにはどうすればよいですか?

回答

$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill

免責事項:このコマンドは特定の場合にのみ機能します。端末にコピーして貼り付けて使用を開始しないでください。疑いなくプロセスを強制終了する可能性があります。むしろそれを構築する方法を学びます

使い方

1- ps aux

このコマンドは、実行中のプロセスのリストとそれらに関する情報を出力します。興味深い情報は、2番目の列に各プロセスのPIDを出力するということです。これが私のボックスでのコマンドの出力からの抜粋です:

$ ps aux
 rahmu     1925  0.0  0.1 129328  6112 ?        S    11:55   0:06 tint2
 rahmu     1931  0.0  0.3 154992 12108 ?        S    11:55   0:00 volumeicon
 rahmu     1933  0.1  0.2 134716  9460 ?        S    11:55   0:24 parcellite
 rahmu     1940  0.0  0.0  30416  3008 ?        S    11:55   0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
 rahmu     1941  0.0  0.2 160336  8928 ?        Ss   11:55   0:00 xfce4-power-manager
 rahmu     1943  0.0  0.0  32792  1964 ?        S    11:55   0:00 /usr/lib/xfconf/xfconfd
 rahmu     1945  0.0  0.0  17584  1292 ?        S    11:55   0:00 /usr/lib/gamin/gam_server
 rahmu     1946  0.0  0.5 203016 19552 ?        S    11:55   0:00 python /usr/bin/system-config-printer-applet
 rahmu     1947  0.0  0.3 171840 12872 ?        S    11:55   0:00 nm-applet --sm-disable
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:38 conky -q

2- grep conky

私は1つのプロセスにしか興味がないのでgrep、プログラムに対応するエントリを見つけるために使用しますconky

$ ps aux | grep conky
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q
 rahmu     3233  0.0  0.0   7592   840 pts/1    S+   16:55   0:00 grep conky

3- grep -v grep

手順2でわかるように、コマンドはリストにプロセスをps出力しgrep conkyます(結局は実行中のプロセスです)。フィルタリングするには、を実行しgrep -v grepます。このオプション-vは、パターンを含むgrepを除くすべての行に一致するように指示します。

$ ps aux | grep conky | grep -v grep
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q

注:1回のgrep呼び出しで手順2と3を実行する方法を知りたいです。

4- awk '{print $2}'

これで、ターゲットプロセスが分離されました。PIDを取得したい。つまり、出力の2番目の単語を取得する必要があります。私にとって幸運なことに、ほとんどの(すべて?)現代のユニックスはawk、表形式のデータに驚異的なスクリプト言語のバージョンを提供します。私たちのタスクはのように簡単になりprint $2ます。

$ ps aux | grep conky | grep -v grep | awk '{print $2}'
 1948

5- xargs kill

PIDがあります。必要なのは、それをに渡すことだけkillです。これを行うには、を使用しますxargs

xargs kill入力から読み取られます(パイプから我々の場合に)形成コマンドからなるkill <items><items>それは入力から読み取らどんなれる)を、次に作成したコマンドを実行します。この場合、実行されkill 1948ます。任務完了。

最後の言葉

使用しているUNIXのバージョンに応じて、特定のプログラムの動作が少し異なる場合があります(たとえば、ps列$ 3にPIDを出力する場合があります)。何かが間違っている、または異なっているように思われる場合は、ベンダーのドキュメント(またはそれ以上のmanページ)を読んでください。また、長いパイプは危険ですので注意してください。特にkillやなどのコマンドを使用する場合は、何も仮定しないでくださいrm。たとえば、「conky」(または「Aconkyous」)という名前の別のユーザーがいた場合、私のコマンドは実行中のすべてのプロセスも強制終了する可能性があります!

私が言っていることは、特に長いパイプに対しては注意が必要です。ここで行ったようにインタラクティブにビルドすることは、仮定を立てて後で後悔するよりも、常に良い方です。


NB:1回のgrep呼び出しでステップ2と3を実行する方法を知りたいです。- > grepの"Conkyを-q" :)
Wolfy

3
実際、これは悪い例です。単純に行うことができますkill $(pgrep conky)
パトリック

5
私はこれが遅れていることを知っていますが、あなたはそれをさらに簡素化することができますpkill conky
-strugee

2
"" "NB:1回のgrep呼び出しで手順2と3を実行する方法を知りたいと思います。" "" "aux"の代わりに "-o pid、comm"を使用します。準拠。これにより、grepプロセスは「grep conky」ではなく「grep」として表示されるため、一致しません。
Random832

2
注:1回のgrep呼び出しで手順2と3を実行する方法を知りたいです。 grep [c]onkyあなたが探しているものです。
AlexT

15

私のお気に入りはこれです:

youtube-dl $1 -q -o - | ffmpeg -i - $2

は、渡されたyoutubeのURLからビデオをダウンロードし、で$1指定されたファイルとして出力します$2。ファイルが-qSTDOUT -o -に静かに出力され、ffmpegにパイプされ、そこで入力として使用される方法に注意してください。-i -

特にLinux初心者の場合、これはコマンドラインが便利で、GUIツールを使用するよりも簡単にすることができる実用的な例です。YouTubeからビデオをダウンロードして、そのサウンドをmp3に変換するのにどれくらい時間がかかるかわかりません。上記の行は数秒でそれを行うことができます。


3
youtube-dlには、音声のみを保存するオプションがあります。私の通常のコマンドはこれです。URLはstdin:にありyoutube-dl --extract-audio --audio-format mp3 -a -ます。まだクールな例ですが、簡単な方法があります。(内部でffmpegを呼び出します。)
ブリガンド

3
@FakeRainBrigand:ハハ、知っておくべきこと!しかし、組み込まれてはならない代替手段がyoutube-dl $1 -q -o - | mplayer -ありました。mplayer内でビデオを直接再生します。私は自分のラップトップからこのコマンドを使用して、サーバー(テレビに接続されている)にビデオを再生するよう指示します。-display :0.0 -geometry 400x300+1200+200mplayerウィンドウを正しい画面に表示するには、追加する必要があります。
バーン

9

一般的な使用(読み方:ほとんどの場合、私はそれを使用しています)は、何らかの理由で、いくつかのデータをいくつかのツールで実行して、異なる処理タスクを実行する必要がある場合です。

したがって、パイプ使用は、いくつかのビルディングブロック(異なるUNIXツール)を一緒に組み立てるための接着剤として使用すると思います。ウルリッヒが言ったように、sortそれuniqは一般的なスタンザです。

聴衆によっては、このパイプの使用法を強調したい場合は、例えば、次のように始めることができます。どういうわけかこれを自動化しますか?」

そして、あなたはどのように示すことができたlynx --dump --listonlyか、リンクのリストを取得し、grepで終わるのリンクをフィルタリングでき.pdfか、colrmまたはsed数字を取り除くことができlynx、どのように各URLに任さ書き込みsortuniq重複を取り除くことができ、最終的にどのようにwget -i -取得するために使用することができますファイル(--waitもちろん、サーバー上で優しくするために使用)。

これは複雑な例だと思います。一方、パイプをパイプして、シェルに一度に実行させると、パイプの威力を示すのに役立ちます。


2
あなたは使用することができますsort -uのGNU coreutilsのあまりに。
テレサeジュニア

2

良いことについては正確には知りませんが、パイプスルーgrepは最も一般的な使用法の1つである必要がありwc -lます。(はい、grepあまり知られていない-cスイッチがあります。)

もう1つの一般的なスタンザは| sort | uniquniq入力をソートする必要があるためだけです。


... | sort -u可能であれば、ほとんどの人が好みます!

2

この例で必要なわけではありませんが、次のとおりです。

$ ps aux | grep -v grep | grep conky

...グレープの順序を逆にすると、色付けは維持されますが、効率は大幅に低下します。おそらく大きなリストでは、色は重要ではありません。

また、このWebページは以下を提案しています。

https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

> Johnsywebは12:02に10:31に回答しました
>通常のトリックはこれです:
> ps aux | grep '[t] erminal'
>これは、grep '[t] erminal'が含まない端末を含む行に一致します!
>多くの種類のUnixでも動作します。

...ただし、1つの文字(プロセス 'X'など)を探している場合は機能しません。


2

私はついに約1年半前に作ったワンライナーのこの混乱を共有することができます...

while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'

それ...

  1. sites.txtを読み取ります
  2. それぞれで「ホスト」を実行します(後から考えてみると、dig + shortはこれを非常に簡単にします)。
  3. 「GOOGLE」を含む行を削除します-これらはmxレコードです
  4. 2つのIPのいずれかを持つ行を取得します
  5. リスト内の各サイトからhttpステータスコードを取得します
  6. 4xxまたは5xxを返すサイトを削除します
  7. それを返したサイトから「200」を取り除きます
  8. 「HTTP」を「http」に置き換えます-純粋に美的であり、本当の理由はありません。

これは、単一のPythonスクリプトを使用することではるかに改善できたはずです。


ええと…これが初心者向けのパイピングを説明するための最もクリーンで簡単な例になるかどうかわかりません;)
エラティエル

2
私の質問は、その目的は何ですか?
ADTC

ドメインがいっぱいのファイルがあり、それらが2つのサーバーのいずれかにあるかどうかを確認する必要がありました(残念ながら「継承」しました)。これはファイルを読み取り、「ホスト」を実行してその出力をクリーンアップし、4xxまたは5xxエラーを返すかどうかを確認する要求を実行するだけです。存在する場合、ドメインは破棄されます。そうでない場合は、それらを出力し、別のファイルに入れます。
タナー

1

これが最初に思い浮かんだことです...

mysqldumpデータ、スキーマ、およびオプションでプロシージャと関数をstdoutに送信するコンソールアプリケーションです。通常、バックアップ用のファイルにリダイレクトされます。

mysqldump <options> > mydb.dump

これにより、非圧縮のSQLスクリプトが得られます。スペースを節約するために、bzip2で圧縮できます。

bzip2 mydb.dump

または、1つの手順で両方を実行できます。

mysqldump <options> | bzip2 > mydb.dump.bz2

上記のこの例では、stdout from mysqldumpがbzip2にパイプされ、bzip2の出力がファイルにリダイレクトされます。


1
逆の操作も追加しますbzcat mydb.dump.bz2 | mysql <options>
マナトワーク

1

これは、1つのコマンドで複数のパイプの仕事に使用する例です。これはgawkを使用してMySQLの一般的なクエリログ($ OFILE)を検索し、拒否されたログインを見つけます。次に、そのリストを名前でソートし、そのリストをuniqにパイプして発生をカウントし、最後にもう一度ソートして、カウントされたリストを数値でソートします...

gawk '{ for (x=1;x<=NF;x++) if ( $x~"Access" && $(x+4)~".*@.*") print $(x+4)}' $OFILE | sort | uniq -c | sort -n

1

パイプはフィルターとトランスレーターで最適に動作します

find /usr/bin/ |                #produce 
sed 's:.*/::'  |                #translate: strip directory part
grep -i '^z'   |                #filter   : select items starting with z
xargs -d '\n' aFinalConsumer    #consume  

このように、データは1つのプログラムから次の1つのバッファフルに流れることができ、すべてのデータが一度にメモリ内にある必要はありません。


0

cat filename | less あなたがすることができるので、配管のひどい使用です less filename

以下は、私が毎日使用しているピップの例です(ただし、悪い例でもあります)。 ls -la | more -c

スコット・ホフマンとnjsgの回答がより良い例です。



0

フォルダサイズのソートされた分析が必要な任意のディレクトリでこれを実行します(その後、ENDキーで下にスクロールします)。

du -m| sort -n| less

Sortiert nachOrdnergrösse


0

以下は、xauthがオプションではなかったときにDISPLAY変数を設定するために使用した例です...

export DISPLAY=\`who am i |awk '{print $NF}' | sed 's/[()]//g'`":0.0"

最初のコマンドは、必要なデータ、つまりホスト名またはIPを取得します。2番目のコマンドは、そのデータのみを取得します(最後のフィールド)。最後に、最後のコマンドはデータから括弧を取り除きます。


0

コマンドパイピングは、最初のコマンドの出力を次の入力として入力できると思う場所であればどこでも使用できます。

例。

  1. テキストファイルを使用すると、テキストファイルをgrepに渡して、特定のテキスト行を見つけることができます。次に、出力をsedまたはawkに渡して、行の特定の部分を変更または印刷できます。

猫の例txt | grep {some_line} | awk {some_command}

  1. プロセスを操作する場合、パイピングを使用してコマンドを送信し、プロセスを強制終了できます。

単に、実行したコマンドの出力を感じる場合、別のコマンドの入力になり、それらをパイプできるという概念です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.