Linux sedコマンドの使用

Linux sedコマンドの使用

1. 機能紹介

sed (Stream EDitor) は、コンテンツを 1 行ずつ処理するストリーム ファイル エディターです。処理中、現在処理中の行は「パターン スペース」と呼ばれる一時バッファに保存されます。次に、sed コマンドを使用してバッファの内容を処理します。処理が完了すると、バッファの内容が画面に送信され、ファイルの最後まで次の行が処理されます。 -i オプションを使用しない限り、ファイルの内容は変更されません。 sed は主に、1 つ以上のファイルを編集したり、ファイルに対する繰り返し操作を簡素化したり、変換プログラムを作成したりするために使用されます。

sed の機能は awk と似ていますが、違いは sed の方が単純で列処理機能がそれほど強力ではないのに対し、awk の方が複雑で列処理機能が強力である点です。

2. コマンド形式

sed [オプション]... {他のスクリプトがない場合のみのスクリプト} [入力ファイル]...

OPTION はコマンドオプション、script-only-if-no-other-script は処理アクションで、-e で複数指定できます。input-file は入力ファイルで、複数指定できます。

3. オプションの説明

オプション:
-n、--quiet、--silent: 静音モードを使用します。 sed の一般的な使用法では、通常、STDIN からのすべてのデータが端末に出力されます。-n を追加すると、sed によって特別に処理された行だけがリストされます。
-e <script>,--expression=<script>: sed アクションを指定します。複数の -e で複数のアクションを指定できます。
-f <スクリプト ファイル>、--file=<スクリプト ファイル>: sed アクションをファイルに直接書き込みます。-f ファイル名はファイル名内の sed アクションを実行できます。
-r、--regexp-extended: sed は拡張正規表現をサポートします (デフォルトは基本正規表現です)。
-i: 読み取ったファイルの内容を端末に出力するのではなく、直接変更します。
--help: ヘルプを表示します。
--version: バージョンを表示します。

アクションの説明: [n1[,n2]]関数
n1、n2: 存在しない場合があります。通常は「アクションを実行する行数を選択する」ことを表します。たとえば、アクションを 10 行から 20 行の間で実行する必要がある場合は、「10,20 アクション動作」と記述します。

関数:
a : 追加されました。a の後に文字列を続けることができ、これらの文字列は新しい行 (現在の行の次の行) に表示されます。
c: 置換。c の後に文字列を続けると、n1 と n2 の間の行を置き換えることができます。
d: 削除。削除を意味するので、通常は d の後に何も入りません。
i : 挿入。i の後に文字列を続けることができ、これらの文字列は新しい行 (現在の行の前の行) に表示されます。
p: 印刷、つまり選択したデータを印刷します。通常、pはパラメータsed -n~で実行されます。
s: 置換。通常、この s アクションは正規表現で使用できます。たとえば、1,20s/old/new/g などです。

4. 典型的な例

4.1 行削除操作

(1)/etc/passwdの内容を一覧し、行番号を出力します。同時に、2行目から5行目を削除します。

[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2,5d'
 ルート:x:0:0:root:/root:/bin/bash
 同期:x:5:0:sync:/sbin:/bin/sync
 シャットダウン:x:6:0:シャットダウン:/sbin:/sbin/シャットダウン
.....(以下略).....

注意: 本来は sed -e を発行する必要があります。アクションが 1 つだけの場合には -e なしでも問題ありませんが、アクションが複数ある場合には -e オプションを使用してアクションを指定する必要があります。また、sed に続くアクションは 2 つの一重引用符で囲む必要があることにも注意してください。

(2)2行目を削除するだけです。

/etc/passwd | sed '2d' を実行します

(3)最後から3行目を削除する

/etc/passwd | sed '3,$d' を実行します

4.2 行追加操作

(1)2行目の後に「私はお茶を飲むのが好きです」と付け加えます。

[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a 私はお茶を飲むのが好きです'
 ルート:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/ログインなし
私はお茶を飲むのが好きです
 デーモン:x:2:2:デーモン:/sbin:/sbin/nologin
.....(以下略).....

(2)2行目より前に追加する場合は、

nl /etc/passwd | sed 'お茶を飲む'
// または nl /etc/passwd | sed '1a drink tea'

(3)2行目の後に「私はお茶を飲むのが好きです」と「私はビールを飲むのが好きです」という2行を追加します。

[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a 私はお茶を飲むのが好きです\n私はビールを飲むのが好きです'
  ルート:x:0:0:root:/root:/bin/bash
  bin:x:1:1:bin:/bin:/sbin/ログインなし
私はお茶を飲むのが好きです
私はビールを飲むのが好きです
  デーモン:x:2:2:デーモン:/sbin:/sbin/nologin
…(以下省略)…

または、バックスラッシュ \ を使用して各行を区切り、次のようにコマンド ラインに複数行のコマンドを入力することもできます。

[b3335@MIC ~]$ nl -n ln /etc/passwd | sed '2a 私はお茶を飲むのが好きです\
> ビールを飲むのが好きです

4.3 ライン交換操作

(1)2行目から5行目の内容を「2~5番号」に置き換える。

[b3335@MIC ~]$ nl -nln /etc/passwd | sed '2,5c No 2-5 番号'
  ルート:x:0:0:root:/root:/bin/bash
2-5番
  同期:x:5:0:sync:/sbin:/bin/sync
.....(以下略).....

4.4 ライン印刷の選択

(1)/etc/passwdファイルの5行目から7行目のみをリストします。

[root@www ~]# nl -nln /etc/passwd | sed -n '5,7p'
 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 同期:x:5:0:sync:/sbin:/bin/sync
 シャットダウン:x:6:0:シャットダウン:/sbin:/sbin/シャットダウン

4.5 データの検索と関連操作の実行

(1)データの検索と表示

/etc/passwd でキーワード root を含む行を検索し、出力します。

[b3335@MIC ~]$ nl /etc/passwd | sed -n '/root/p'
 ルート:x:0:0:root:/root:/bin/bash
 オペレータ:x:11:0:オペレータ:/root:/sbin/nologin

(2)データを検索して削除する /etc/passwd内のrootを含む行をすべて削除し、残りの行を出力します。

[b3335@MIC ~]$ nl /etc/passwd | sed '/root/d'
 デーモン:x:1:1:デーモン:/usr/sbin:/bin/sh
 bin:x:2:2:bin:/bin:/bin/sh
…(以下は無視してください)…

一致する文字列を削除する場合は、次のコマンドを使用します。

[b3335@MIC ~]$ nl /etc/passwd | sed 's/root//g'

(3)データの検索と置換 sedは行全体の処理モードに加えて、行単位で部分的なデータの検索と置換を行うこともできます。基本的に、sed の検索と置換は vi と非常に似ています。彼はこんな感じです:

sed 's/置換された文字列/新しい文字列/g'

(4) データを検索してコマンドを実行する /etc/passwdを検索し、rootに対応する行を見つけて、中括弧内のコマンドセットを実行します。各コマンドはセミコロンで区切られています。ここでbashをblueshellに置き換えて、次の行を出力します。

/etc/passwd | sed -n '/root/{s/bash/blueshell/;p}' を実行します。
 ルート:x:0:0:root:/root:/bin/blueshell

/etc/passwdの最初のbashキーワードのみがblueshellに置き換えられた場合は終了する

/etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' を実行します。 
ルート:x:0:0:root:/root:/bin/blueshell

4.6 sedコマンドを編集して、/etc/passwdの3行目から末尾までのデータを削除し、bashをblueshellに置き換えます。

/etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' を実行します
 ルート:x:0:0:root:/root:/bin/blueshell
 デーモン:x:1:1:デーモン:/usr/sbin:/bin/sh

-e はマルチポイント編集を意味します。最初の編集コマンドは、/etc/passwd の 3 行目から末尾までのデータを削除します。2 番目のコマンドは bash を検索し、blueshell に置き換えます。

4.7 ファイルを直接変更する

sed は、パイプ コマンドやデータ ストリームのリダイレクトを使用せずに、ファイルの内容を直接変更できます。 ただし、この操作は元のファイルを直接変更するため、システム構成をテスト用に安易に使用せず、使用時には注意してください。ダウンロードしたregular_express.txtファイルを使ってテストしてみましょう。

sed を使用して、regular_express.txt 内の . で終わるすべての行を ! に置き換えます。

[root@www ~]# sed -i 's/\.$/!/g' レギュラー_express.txt

sed を使用して、regular_express.txt の最後の行に「# This is a test」を直接追加します。

[root@www ~]# sed -i '$a # これはテストです'regular_express.txt

$ は最後の行を表し、a のアクションは追加であるため、ファイルの末尾に「# これはテストです」が追加されます。

sed の-iオプションを使用すると、ファイルの内容を直接変更できるので、非常に便利です。たとえば、100 万行のファイルがあり、100 行目にテキストを追加したい場合、vim を使用すると面倒なことになるかもしれません。ファイルが大きすぎるからです。ではどうすればいいでしょうか? sed を使うだけです! sed には直接変更/置換する機能があるため、修正を行うために vim を使用する必要さえありません。

上記は Linux sed コマンドの使用に関する詳細な内容です。Linux sed コマンドの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • Linux で xargs コマンドを使用する詳細なチュートリアル
  • Linux trコマンドの使用
  • Linux ipcsコマンドの使用
  • Linux sar コマンドの使用方法とコード例の分析
  • Linux lsコマンドの使用
  • Linuxの読み取りコマンドの使用
  • Linux usermod コマンドの使用
  • Linuxのpasswdコマンドの使用
  • Linuxのtimeコマンドの使い方の詳しい説明
  • Linux lnコマンドの使用
  • Linux telnetコマンドの使用

<<:  要素動的ルーティングブレッドクラムの実装例

>>:  Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

推薦する

Docker データボリュームコンテナの作成と使用状況分析

データ ボリューム コンテナーは、データ ボリュームをマウントするために特別に使用されるコンテナーで...

ubuntu15.10 での hadoop2.7.2 の詳細なインストールと設定

Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...

Nginx のインストールと設定ルールの詳細な紹介

目次1. nginxのインストールと操作(Mac OS環境) 2. nginxルールの設定3. コマ...

MySQLdump コマンドを使用した MySQL データの移行

このソリューションの利点はシンプルさと使いやすさですが、欠点はダウンタイムが長くなることです。 した...

Linux での nginx のインストール、展開、使用方法の詳細な説明

目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...

WeChatアプレットでSVGアイコンを使用する方法

SVG は、さまざまな利点があるため、近年広く使用されています。残念ながら、WeChat ミニプログ...

MySQL の一般的な SQL ステートメントの概要

1. mysqlエクスポートファイル: SELECT `pe2e_user_to_company`....

入力のid属性とname属性の違いの例

長い間ウェブサイトを作ってきましたが、入力時のnameとidの違いがまだわかりません。最近jQuer...

Nginx ロードバランシング クラスタの実装

(1)実験環境youxi1 192.168.5.101 ロードバランサーyouxi2 192.168...

MySQLのタイムゾーンを表示および設定する方法

1. データベースのタイムゾーンを確認する '%time_zone' のような変数を...

訪問者を惹きつけるウェブサイトコンテンツを作成する14の方法

ネットサーフィンをしていると、私の注意を引こうとする美しいグラフィックでいっぱいの Web サイトを...

タイムライン効果を実現するCSS3

最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...

MySQLプロセス関数の一般的な使用例の分析

この記事では、例を使用して MySQL プロセス関数の一般的な使用方法を説明します。ご参考までに、詳...

Tomcat の 404 エラーの解決方法の詳細な説明

Tomcat テストで 404 問題が発生します。問題は次のとおりです。 HTTP ステータス 40...