誰かがコマンドラインでパイプの概念を学ぶのを手伝っていたら、どの例を使用しますか?実際に出てきた例は次のとおりです。
cat whatever.txt | less
それは最良の例ではないように感じます。つまり、1つのステップしかないからです。良いが、基本的な使用は何ですか|
何ですか?
理想的には、ここで紹介する例では、独立して実行でき、一緒にパイプで表示できる出力自体を備えたプログラムを使用します。
cat
ため、その必要はありませんless whatever.txt
。
誰かがコマンドラインでパイプの概念を学ぶのを手伝っていたら、どの例を使用しますか?実際に出てきた例は次のとおりです。
cat whatever.txt | less
それは最良の例ではないように感じます。つまり、1つのステップしかないからです。良いが、基本的な使用は何ですか|
何ですか?
理想的には、ここで紹介する例では、独立して実行でき、一緒にパイプで表示できる出力自体を備えたプログラムを使用します。
cat
ため、その必要はありませんless whatever.txt
。
回答:
実際のシナリオに基づいて、やや複雑な例を紹介します。
問題
コマンド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」)という名前の別のユーザーがいた場合、私のコマンドは実行中のすべてのプロセスも強制終了する可能性があります!
私が言っていることは、特に長いパイプに対しては注意が必要です。ここで行ったようにインタラクティブにビルドすることは、仮定を立てて後で後悔するよりも、常に良い方です。
kill $(pgrep conky)
pkill conky
grep
呼び出しで手順2と3を実行する方法を知りたいです。 grep [c]onky
あなたが探しているものです。
私のお気に入りはこれです:
youtube-dl $1 -q -o - | ffmpeg -i - $2
は、渡されたyoutubeのURLからビデオをダウンロードし、で$1
指定されたファイルとして出力します$2
。ファイルが-q
STDOUT -o -
に静かに出力され、ffmpegにパイプされ、そこで入力として使用される方法に注意してください。-i -
。
特にLinux初心者の場合、これはコマンドラインが便利で、GUIツールを使用するよりも簡単にすることができる実用的な例です。YouTubeからビデオをダウンロードして、そのサウンドをmp3に変換するのにどれくらい時間がかかるかわかりません。上記の行は数秒でそれを行うことができます。
youtube-dl --extract-audio --audio-format mp3 -a -
ます。まだクールな例ですが、簡単な方法があります。(内部でffmpegを呼び出します。)
youtube-dl $1 -q -o - | mplayer -
ありました。mplayer内でビデオを直接再生します。私は自分のラップトップからこのコマンドを使用して、サーバー(テレビに接続されている)にビデオを再生するよう指示します。-display :0.0 -geometry 400x300+1200+200
mplayerウィンドウを正しい画面に表示するには、追加する必要があります。
一般的な使用(読み方:ほとんどの場合、私はそれを使用しています)は、何らかの理由で、いくつかのデータをいくつかのツールで実行して、異なる処理タスクを実行する必要がある場合です。
したがって、パイプの使用は、いくつかのビルディングブロック(異なるUNIXツール)を一緒に組み立てるための接着剤として使用すると思います。ウルリッヒが言ったように、sort
それuniq
は一般的なスタンザです。
聴衆によっては、このパイプの使用法を強調したい場合は、例えば、次のように始めることができます。どういうわけかこれを自動化しますか?」
そして、あなたはどのように示すことができたlynx --dump --listonly
か、リンクのリストを取得し、grep
で終わるのリンクをフィルタリングでき.pdf
か、colrm
またはsed
数字を取り除くことができlynx
、どのように各URLに任さ書き込みsort
やuniq
重複を取り除くことができ、最終的にどのようにwget -i -
取得するために使用することができますファイル(--wait
もちろん、サーバー上で優しくするために使用)。
これは複雑な例だと思います。一方、パイプをパイプして、シェルに一度に実行させると、パイプの威力を示すのに役立ちます。
sort -u
でのGNU coreutilsのあまりに。
良いことについては正確には知りませんが、パイプスルーgrep
は最も一般的な使用法の1つである必要がありwc -l
ます。(はい、grep
あまり知られていない-c
スイッチがあります。)
もう1つの一般的なスタンザは| sort | uniq
、uniq
入力をソートする必要があるためだけです。
この例で必要なわけではありませんが、次のとおりです。
$ 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'など)を探している場合は機能しません。
私はついに約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/'
それ...
これは、単一のPythonスクリプトを使用することではるかに改善できたはずです。
これが最初に思い浮かんだことです...
mysqldump
データ、スキーマ、およびオプションでプロシージャと関数をstdoutに送信するコンソールアプリケーションです。通常、バックアップ用のファイルにリダイレクトされます。
mysqldump <options> > mydb.dump
これにより、非圧縮のSQLスクリプトが得られます。スペースを節約するために、bzip2で圧縮できます。
bzip2 mydb.dump
または、1つの手順で両方を実行できます。
mysqldump <options> | bzip2 > mydb.dump.bz2
上記のこの例では、stdout from mysqldump
がbzip2にパイプされ、bzip2の出力がファイルにリダイレクトされます。
bzcat mydb.dump.bz2 | mysql <options>
。
使用方法tail
、sed
およびgrep
段階的に構築できるパイプコンテキストで示します。
コマンドパイピングは、最初のコマンドの出力を次の入力として入力できると思う場所であればどこでも使用できます。
例。
猫の例txt | grep {some_line} | awk {some_command}
単に、実行したコマンドの出力を感じる場合、別のコマンドの入力になり、それらをパイプできるという概念です。