web-dev-qa-db-ja.com

grep、awkなどを使用してコマンド出力をフィルタリングする

例としてrouteを使用します。

route -n

上記はルーティング情報を出力します。一番上の行はアクティブな接続です。以下を実行することで、2番目の列への出力を操作できます。

route -n | awk '{print $2}'

今、どのように行でフィルタリングできますか?

3
Brian Graham

特定の行を印刷するには、sedを使用できます。

route -n | sed -n 2p

2行目を印刷します。

sed、何ですか

sedとは何かについて、短く不完全な説明をします。完全な説明については、sed情報ページを参照することをお勧めします(info sedを実行)。

sed mean streameditor、つまり、行動できるエディタテキストデータのストリーム(またはパイプ)。ただし、ファイルに対しても機能します。これは、実質的に(edとは異なり)前の行に戻ることができないことを意味します。

sedは、awkが一度に1行を読み取り、その行にスクリプトを適用して変更する可能性があるためです。スクリプトの最後に、デフォルトで変更された行が標準出力に出力されます。その後、sedは次の行に進みます。

スクリプトはアドレスとコマンドのペアのシーケンスであり、行がアドレスと一致する場合、コマンドが実行されます。

sedの一般的な使用法は、パターンを何かで置き換えることです。

command | sed 's/ *$//'

ここで、単一引用符で囲まれた文字列は、単一のアドレスとコマンドのペアで構成されるスクリプトです。アドレスがありません(sの前に表示されます)。このような場合、コマンドはデフォルトですべての入力行に適用されます。 sはコマンドであり、文字列の残りはコマンド固有の命令であり、「行の末尾にスペース()文字(0 [SOME_CODE] _)を0個以上(*)置​​換($)それらを削除します)」。

他の便利なコマンドはpおよびdです。 pコマンドは現在の行を出力します。これは、スクリプトの最後に現在の行を出力するようにデフォルトの動作を変更する-nオプションと組み合わせて使用​​すると便利です。だから

sed -n '2p'

スクリプトは、アドレス2pおよびコマンドpで構成される文字列2であるため、-nオプションにより、行2が印刷され、代わりに他のすべての行は印刷されません。 。

dコマンドは、たとえば、行を削除します

    sed '3,6d'

3番目から6番目までのすべての行を削除します。 3,6はアドレス範囲です。この場合、他のすべての行を出力するため、-nオプションを使用しないでください。

最後に、アドレスは次のようなパターンにすることができます

sed -n '/^#/p'

このコマンドは、^文字で始まる(#)すべての行を出力します。

3
enzotib

Grepにパイプして目的のIPアドレスで始まる行を見つけることで、INの行をフィルター処理できます。たとえば、192.168.1.1の行を表示する場合は、次のようにします。

$ route | grep ^192.168.1.0
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0

「^」マークは「line-starts-with」を意味します。したがって、より一般的になる可能性があります。

$ route | grep ^192.168.1
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.111.0   *               255.255.255.0   U     0      0        0 virbr0
1
kyleN

正規表現を使用して、希望する行をawkに伝えることができます。

route -n | awk '/^192.168/ {print $2}'

192.168で始まるすべての行の秒列を出力します

1
Florian Diesch

awkの回答も次のようになります。

$0 ~ ( /matchthis/ ) { print $2 }

$ 0は単に行/行全体を指します

sedとawkは非常に強力な組み合わせになります

正規表現は習得する価値がある

0
Manse Jennings