コマンドを一緒に組み合わせる良い例は何ですか?

コマンドを一緒に組み合わせる良い例は何ですか?

誰かがコマンドラインでパイプの概念を学ぶのを手伝っている場合は、どのような例を使用しますか?実際の例は次のとおりです。

cat whatever.txt | less

ステップが1つだけなので、これが最良の例ではないようです。良いが基本的な用途は何ですか|

理想的には、私が示す例では、出力自体を持つプログラムを使用し、独立して実行してから一緒にパイプすることができます。

答え1

実際のシナリオに基づいて、より複雑な例を見てみましょう。

質問

conkyデスクトップでコマンドが応答せずに手動で終了したいとします。私はUnixについて少し知っているので、コマンドを実行することが何であるかを知っていますkill <PID>。 PIDを検索するには、Unixディストリビューションで提供されているツールを使用できますpstopしかし、どのようにしてコマンドを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のバージョンによっては、一部のプログラムが少し異なる動作をする場合があります(たとえば、psPIDが$ 3列に出力される場合があります)。何か間違っている場合や他の場合は、ベンダーのマニュアル(またはページman)をお読みください。また、長いパイプは危険な場合がありますのでご注意ください。特にkill同じコマンドを使用するときは、何の仮定もしないでくださいrm。たとえば、「conky」(または「Aconkyous」)という名前の別のユーザーがいる場合、私のコマンドはそのユーザーの実行中のプロセスもすべて終了できます。

特に長いパイプの場合は注意してください。仮定し、後で後悔するよりも、ここでやったようにインタラクティブに構築する方が常に良いです。

答え2

私が一番好きなのはこれです:

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

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

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

答え3

一般的な使用(読み取り:私が主に使用する方法)は、何らかの理由でさまざまな処理タスクを実行するために複数のツールを介していくつかのデータを実行する必要がある場合です。

だから私は言いたいこれパイプを使用すると、複数のビルディングブロック(他のUNIXツール)を一緒に組み立てる接着剤として機能します。 Ulrichが言ったように、sortそしてuniqは一般的なスタンザです。

観客に応じてパイプの使用を強調したい場合は、次のように始めることができます。 「このレッスン計画書には、論文や配布資料を含むいくつかの興味深いPDFへのリンクがありますが、それらのいくつかは重複しています。「何とか自動化しますか?」

その後、リンクのリストを取得する方法、lynx --dump --listonlyフィルタリングをリンク先のgrepBe Gentle on the serverとして表示することができます。.pdfcolrmsedlynxsortuniqwget -i ---wait

残念ながら、これは複雑な例です。一方、パイプを接続してシェルですべてのパイプを同時に実行させることで、パイプの強力な機能を実証するのに役立ちます。

答え4

これが一番最初に思い浮かびます...

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

mysqldump <options> > mydb.dump

これにより、圧縮されていないSQLスクリプトが提供されます。スペースを節約するには、bzip2を使用して圧縮できます。

bzip2 mydb.dump

あるいは、1つのステップで両方を実行することもできます。

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

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

関連情報