
誰かがコマンドラインでパイプの概念を学ぶのを手伝っている場合は、どのような例を使用しますか?実際の例は次のとおりです。
cat whatever.txt | less
ステップが1つだけなので、これが最良の例ではないようです。良いが基本的な用途は何ですか|
?
理想的には、私が示す例では、出力自体を持つプログラムを使用し、独立して実行してから一緒にパイプすることができます。
答え1
実際のシナリオに基づいて、より複雑な例を見てみましょう。
質問
conky
デスクトップでコマンドが応答せずに手動で終了したいとします。私はUnixについて少し知っているので、コマンドを実行することが何であるかを知っていますkill <PID>
。 PIDを検索するには、Unixディストリビューションで提供されているツールを使用できますps
。top
しかし、どのようにしてコマンドを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
サム -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回の通話でステップ2と3を実行する方法を知りたいですgrep
。
4-awk '{print $2}'
これでターゲットプロセスを分離しました。 PIDを検索したいです。つまり、出力の2番目の単語を検索したいのです。幸いなことに、ほとんどの最新の unice は、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
PIDが$ 3列に出力される場合があります)。何か間違っている場合や他の場合は、ベンダーのマニュアル(またはページman
)をお読みください。また、長いパイプは危険な場合がありますのでご注意ください。特にkill
同じコマンドを使用するときは、何の仮定もしないでくださいrm
。たとえば、「conky」(または「Aconkyous」)という名前の別のユーザーがいる場合、私のコマンドはそのユーザーの実行中のプロセスもすべて終了できます。
特に長いパイプの場合は注意してください。仮定し、後で後悔するよりも、ここでやったようにインタラクティブに構築する方が常に良いです。
答え2
私が一番好きなのはこれです:
youtube-dl $1 -q -o - | ffmpeg -i - $2
配信された特定のYouTube URLからビデオをダウンロードして、$1
指定したファイルに出力します$2
。このファイルが-q
STDOUTに静かに出力され-o -
、ffmpegにパイプされて入力として使用される方法に注意してください-i -
。
特にLinux初心者の場合、これはコマンドラインが役に立ち、GUIツールを使用するよりも操作を簡単にする理由の実際的な例です。 YouTubeからビデオをダウンロードしてそのサウンドをmp3に変換するのにどれくらいの時間がかかるのかわかりません。上記の行は数秒でこれを行うことができます。
答え3
一般的な使用(読み取り:私が主に使用する方法)は、何らかの理由でさまざまな処理タスクを実行するために複数のツールを介していくつかのデータを実行する必要がある場合です。
だから私は言いたいこれパイプを使用すると、複数のビルディングブロック(他のUNIXツール)を一緒に組み立てる接着剤として機能します。 Ulrichが言ったように、sort
そしてuniq
は一般的なスタンザです。
観客に応じてパイプの使用を強調したい場合は、次のように始めることができます。 「このレッスン計画書には、論文や配布資料を含むいくつかの興味深いPDFへのリンクがありますが、それらのいくつかは重複しています。「何とか自動化しますか?」
その後、リンクのリストを取得する方法、lynx --dump --listonly
フィルタリングをリンク先のgrep
Be Gentle on the serverとして表示することができます。.pdf
colrm
sed
lynx
sort
uniq
wget -i -
--wait
残念ながら、これは複雑な例です。一方、パイプを接続してシェルですべてのパイプを同時に実行させることで、パイプの強力な機能を実証するのに役立ちます。
答え4
これが一番最初に思い浮かびます...
mysqldump
データ、スキーマ、オプションのプロシージャ、および機能を標準出力に送信するコンソールアプリケーション。通常はバックアップ用にファイルにリダイレクトされます。
mysqldump <options> > mydb.dump
これにより、圧縮されていないSQLスクリプトが提供されます。スペースを節約するには、bzip2を使用して圧縮できます。
bzip2 mydb.dump
あるいは、1つのステップで両方を実行することもできます。
mysqldump <options> | bzip2 > mydb.dump.bz2
上記の例では、stdout fromはmysqldump
bzip2にパイプされ、bzip2の出力はファイルにリダイレクトされます。