GNU/Linux >> Linux の 問題 >  >> Linux

テキスト操作のための3つの必知のLinuxコマンド

システム管理者は数え切れないほどのコマンドラインツールを使用しており、おそらくこの記事で説明されている3つを定期的に使用しています: grep sed 、および awk 。しかし、テキストを操作するためにそれらを使用できるすべての方法を知っていますか?そうでない場合(またはわからない場合)は、読み続けてください。

始める前に、コマンドの名前の由来は次のとおりです。

  1. grep :ウィキペディアによると、名前は「 edに由来します コマンドg/re / p( g rを大げさに検索します egular e xpressionとp rint match lines)、これは同じ効果があります。 " ed 「行指向のテキストエディタ」です。コマンドラインが好きな人でも、ファイルを1行ずつ編集するのは古すぎるように見えますが、古代では何かから始めなければなりませんでした。 。
  2. sed :この名前は、 sとしての主な用途に由来しています tream ed itor。
  3. 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 各行の最初のフィールドを出力します(区切り文字がであることを考慮) 。

詳細

これらは、 grepを使用するための簡単な例です。 、 sed 、および awk

manを読んだ場合 それぞれのページで、これらの便利なコマンドの多くの追加パラメータと使用法に気付くでしょう。

単純な使用例やたまにしか行わないことについては、ツールボックスにこのようなツールを含めることをお勧めします。

必要なアクションがより複雑な場合は、これらのツールを使用しても意味があるかどうかを検討する価値があります。企業のユースケースや「すべてをコードとして」管理する場合は、Ansibleを使用することをお勧めします。 Ansibleモジュールには、上記の操作をエミュレートできる同様の機能がありますが、Ansibleモジュールには通常べき等性があり、プロセス全体がどこか(内部のGitリポジトリなど)に文書化されるという利点があります。


Linux
  1. すべてのユーザーに必要な20のLinuxコマンド

  2. 効果的なプロセス管理のための8つのLinuxコマンド

  3. Bash bangコマンド:Linuxコマンドラインの必知のトリック

  1. Webイメージを最適化するための私のお気に入りのLinuxコマンド

  2. 生産性のための3つの重要なLinuxチートシート

  3. Linux –特定の単語をgrepしてテキストを取得する方法は?

  1. 一般的なLinuxコマンドのチートシート

  2. Linuxで効果的なファイル操作を行うためにテキストをフィルタリングするための12の便利なコマンド

  3. ネットワーク診断用の10のLinuxコマンド