システム管理者は数え切れないほどのコマンドラインツールを使用しており、おそらくこの記事で説明されている3つを定期的に使用しています: grep
、 sed
、および awk
。しかし、テキストを操作するためにそれらを使用できるすべての方法を知っていますか?そうでない場合(またはわからない場合)は、読み続けてください。
始める前に、コマンドの名前の由来は次のとおりです。
-
grep
:ウィキペディアによると、名前は「ed
に由来します コマンドg/re / p( g rを大げさに検索します egular e xpressionとp rint match lines)、これは同じ効果があります。 "ed
「行指向のテキストエディタ」です。コマンドラインが好きな人でも、ファイルを1行ずつ編集するのは古すぎるように見えますが、古代では何かから始めなければなりませんでした。 。 -
sed
:この名前は、 sとしての主な用途に由来しています tream ed itor。 -
awk
:その名前は、作者のイニシャル(Aho、Weinberger、およびKernighan)に由来しています。カーニハンという名前があなたのために鐘を鳴らしている場合(しゃれを意図している)、それはこのカナダのコンピューター科学者がUnixの作成に貢献し、C言語に関する最初の本を共同執筆したためです。
コマンドの系図を追跡することは優れていますが、本当に重要なのは、これらのコマンドがテキスト操作に非常に役立つことです。
次の例では、 quotes.txt
という名前のファイルを使用します。 コマンドの使用方法を説明します。このファイルの内容は次のとおりです。
$ cat quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking
"I regard consciousness as fundamental..."
- Max Planck
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg
grep
grep
を使用する最も簡単な方法 は:
$ grep universe quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
この例では、検索する文字列(universe)とそれを検索する場所(quotes.txt)を示しています。
検索する文字列にスペースがある場合は、その周りに引用符を付ける必要があります:
$ grep "the universe" quotes.txt
"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
grep
を使用する場合のいくつかの一般的なバリエーション は:
- 大文字と小文字を区別しない:
grep -i string-to-search filename
- 複数のファイルを検索:
grep -i string-to-search * .txt
正規表現を検索できます:
$ grep "191[0-9]" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
拡張正規表現パターンを有効にして、 +
などの記号を使用する場合 、?コード> 、または
|
、 egrep
を使用できます コマンド。-E
を追加するためのショートカットです。 grep
へのフラグ 。これにより、複数の文字列を検索することもできます:
$ egrep -i "albe|hawk" quotes.txt
- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking
「universe」という単語と次の行を含む行を表示するには(作成者の名前を含めるため):
$ grep -i universe -A 1 quotes.txt
"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan
ご想像のとおり、もっとを表示できます。 別の番号を渡すことによって行。または、フラグ -B
を使用して、前に行を表示することもできます。 。
これまで、 grep
を示してきました 単独で実行しますが、コマンドのチェーンに含めることは非常に一般的です:
$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"
- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan
[これなしでは生きていけない11のLinuxコマンドを読むことにも興味があるかもしれません。 ]
sed
sed
の私のお気に入りの使用法 ファイル内の文字列を置き換えることです。例:
$ cat quotes.txt | sed 's/universe/Universe/g'
これはuniverse
に置き換わるものです Universe
を使用 結果をstdoutに送信します 。 g
フラグは、「各行の文字列のすべての出現箇所を置き換える」ことを意味します。
このためのいくつかのバリエーションは次のとおりです。
- 最初の3行にある場合にのみ、文字列を置き換えます。
sed '1,3 s / universe / Universe / g'quotes.txt
- nを交換します -行内のパターンの2番目の出現(たとえば、2番目の出現):
sed's / universe / Universe / 2'quotes.txt
これらの例では、元のファイルは変更されません。 sed
が必要な場合 ファイルを元の場所に変更するには、 -i
を使用します :
$ sed -i 's/universe/Universe/g' quotes.txt
-i
を使用する場合 フラグを立てて、何が何回発生するかを正確に把握していることを確認してください 元のファイルが変更されるため、影響を受けます。調べるには、 grep
を実行できます 最初にパターンを検索します。
[システム管理者のスキルをテストしたいですか?今日、スキル評価を受けてください。 ]
awk
awk
ユーティリティは非常に強力で、テキストファイルを処理するための多くのオプションを提供します。
私がawk
を使用するほとんどの状況 列区切り文字として使用される文字など、合理的に予測可能な構造(列)を持つファイルの処理が含まれます。
awk
の場合 ファイルを処理し、「フィールドセパレータ」(内部変数 FS
)を使用して各行を分割します 、デフォルトではスペース文字です)。各フィールドは位置変数( $ 1
)に割り当てられます 最初のフィールド$2
が含まれています 2番目などが含まれます。 $ 0
フルラインを表します。
各行にフィルターを適用することもできます。例:
$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'
1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
awk
に渡されるコマンド 一重引用符を使用します(解釈するミニプログラムを渡すようなものです):
-
/ universe /
一部はawk
に通知します このパターンに一致する行のみを選択します。 - 「メイン」プログラムは中括弧の間にあります。
-
NR
は、現在のレコードの番号(たとえば、現在の行番号)を含む内部変数です。 -
"-"
を追加しました 美学のための文字列。
awk
の内部変数 は:
-
NR
:コマンドによってこれまでに表示された入力レコードの総数 -
NF
:現在の入力レコードのフィールド数 -
FS
:入力フィールドセパレータ(デフォルトではスペース)
より「予測可能な」ファイル形式を使用した例を次に示します。
$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'
(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom
この最後の例では:
-
/ nologin /
このパターンを含む行のみを選択します。 -
FS =":";
フィールドセパレータを:
に設定します デフォルト(スペース)の代わりに。 -
print $ 1
各行の最初のフィールドを出力します(区切り文字が:
であることを考慮) 。
詳細h2>
これらは、 grep
を使用するための簡単な例です。 、 sed
、および awk
。
man
を読んだ場合 それぞれのページで、これらの便利なコマンドの多くの追加パラメータと使用法に気付くでしょう。
単純な使用例やたまにしか行わないことについては、ツールボックスにこのようなツールを含めることをお勧めします。
必要なアクションがより複雑な場合は、これらのツールを使用しても意味があるかどうかを検討する価値があります。企業のユースケースや「すべてをコードとして」管理する場合は、Ansibleを使用することをお勧めします。 Ansibleモジュールには、上記の操作をエミュレートできる同様の機能がありますが、Ansibleモジュールには通常べき等性があり、プロセス全体がどこか(内部のGitリポジトリなど)に文書化されるという利点があります。