ホームページ >運用・保守 >Linuxの運用と保守 >シェルプログラミングの三剣士のうちの1人のsedコマンドを1つの記事で理解する

シェルプログラミングの三剣士のうちの1人のsedコマンドを1つの記事で理解する

齐天大圣
齐天大圣オリジナル
2020-09-17 17:27:451797ブラウズ

シェル プログラミングの三剣士の 1 人として、sed の重要性は自明のことです。 sed は 1 行ずつ処理し、処理後に次の行を処理するストリーム プログラマで、正規表現をサポートしており、非常に強力です。ただし、sed は通常のコマンドに比べて複雑でオプションも多いため、使いこなすにはある程度の労力が必要です。多くの例を通して、この強力な sed コマンドの役割を見てみましょう。

構文形式: sed [オプション] [アクション]

一般的に使用されるオプションは次のとおりです:

  • -n:デフォルトでは sed が使用され、標準入力の内容をすべて出力しますが、このオプションを使用すると、sed によって処理された行のみが表示されます。

  • -e: 複数のアクションを同じ行で実行できるようにします

  • -f: ファイルからアクションを読み取ります

  • -i: 画面に入力するのではなく、ファイルを直接変更します (危険)

アクションにはパラメーターが多すぎます。以下にリストします。

  • a: 一致する行の下に行を追加します

  • c: 一致する行を新しい内容で変更します

  • d: 一致する行を削除

  • i: 一致する行の前にコンテンツを追加

  • p: 印刷

  • s: 一致する行の内容を置き換えます

#例 1: /etc/passwd ファイルの 5 ~ 10 行目を出力します

# sed -n '5,10p' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

例 2: /etc/passwd ファイルの 2 行目、2 行目から 10 行目までを削除

# cat -n /etc/passwd | sed '2d' | sed '5,10d'

上記に加えてメソッドの場合、-e オプションを使用して完了することもできます。

# cat -n /etc/passwd | sed -e '2d' -e '5,10d'

例 3: サーバーの IP アドレスを取得する

このケースは非常に優れています。 、みんなにお勧めします 詳しく見てください

# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.9.143  netmask 255.255.240.0  broadcast 172.26.15.255
        ether 00:16:3e:0a:01:ad  txqueuelen 1000  (Ethernet)
……

必要なのは 172.26.9.143 です。

最初のステップは、処理したい行を取得することです

# ifconfig eth0 | sed -n &#39;/.*inet/p&#39;
        inet 172.26.9.143  netmask 255.255.240.0  broadcast 172.26.15.255

2 番目のステップは、不要な情報を空白文字に置き換えることです

# ifconfig eth0 | sed -n &#39;/.*inet/p&#39; | sed &#39;s/.*inet\s\+//g&#39;
172.26.9.143  netmask 255.255.240.0  broadcast 172.26.15.255

次に、IP アドレスを入力します後続の置換ビットはすべて空のままにしておきます

# ifconfig eth0 | sed -n &#39;/.*inet/p&#39; | sed &#39;s/.*inet\s\+//g&#39; | sed &#39;s/\s\+.*//g&#39;
172.26.9.143

上の例について説明します まず、最初のステップでは、-n と p を使用して必要な行を取得します。正規表現の \s は少なくとも 1 つのスペースと一致することを意味しますが、ここではプラス記号の前にエスケープ文字 \ を使用する必要があることに注意してください。

例 4

最後の例として、昨日私が実際に経験したケースを挙げます。要件は次のようになります。URL アドレスをテキストで取得しますが、前の http:// は必要ありません。テキスト コンテンツの一部は次のとおりです:

  <td width=820> <a href=http://beijing.hellozx.com onclick="co(&#39;beijing&#39;)"><font color="red">北京</font></a>
     <a href=http://shanghai.hellozx.com onclick="co(&#39;shanghai&#39;)"><font color="red">上海</font></a>
     <a href=http://tianjin.hellozx.com onclick="co(&#39;tianjin&#39;)"><font color="red">天津</font></a>
     <a href=http://chongqing.hellozx.com onclick="co(&#39;chongqing&#39;)"><font color="red">重庆</font></a></td></tr>
<tr><td width=80 height=30 align=right>
<b><font style="font-size:14px;">山东</font>:</b> </td><td width=820>
 <a href="http://jinan.hellozx.com" onclick="co(&#39;jinan&#39;)"><font color=red style="font-size:14px;">济南</font></a>
 <a href="http://qingdao.hellozx.com" onclick="co(&#39;qingdao&#39;)"><font color=red style="font-size:14px;">青岛</font></a>

この要件をいくつかの手順で完了しましょう。まず、URL アドレスを含まないすべての行をフィルターします。

# sed -n &#39;/http:/p&#39; a.txt

次に、不要な情報をすべて空白文字に置き換えます。十分です。まず http:// とその前のすべての文字を削除します

sed -n &#39;/http:/p&#39; a.txt | sed &#39;s/.*http:\/\///g&#39;

、次にすべての二重引用符とその後のすべての文字を削除します

# sed -n &#39;/http:/p&#39; a.txt | sed 's/.*http:\/\///g' | sed 's/".*//g'

これで、画面出力は次のようになります

海口.hellozx.com sanya.hellozx.com kunming.hellozx.com dali.hellozx.com xining.hellozx.com yinchuan.hellozx.com wulumuqi.hellozx.com ……

以上がシェルプログラミングの三剣士のうちの1人のsedコマンドを1つの記事で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。