Linux

テキストファイル内の行毎に、特定の箇所を抽出する

投稿日:

以下の内容を持ったテキストファイル「test.txt」があるとします。

Xfoo11111barXXXXXXXXXXX
XXXfoo22222barXXXXXXXXX
XXXXXXfoo33333barXXXXXX

各行から “foo” と “bar” に囲まれた部分を抽出する方法を紹介します。

つまり、以下の出力が得られれば成功です。

11111
22222
33333

awk コマンドを使って実現するには、以下のコマンドを実行します。

awk '{print substr($0, index($0, "foo") + length("foo"), index($0, "bar") - index($0, "foo") - length("bar"))}' test.txt
  • awk の組み込み関数 index(), length(), substr() を使っています。
  • index(文字列A, 文字列B) と記述すると、文字列Aの中における文字列Bの先頭位置を返してくれます。
  • substr(対象文字列, 開始文字位置, 抽出する文字列の長さ) と記述すると、対象文字列の中の「開始文字位置」から、「抽出する文字列の長さ」の分の文字列を返してくれます。
  • length(文字列) と記述すると、その文字列の長さが返されます。
  • $0」は元のファイルの各行の文字列を指しています。
  • 簡単に言ってしまうと、substr()関数を使って、指定された文字列の間の文字列を抽出しているだけです。抽出する文字列の開始位置と長さを、不格好ながらなんとかして指定しています。

同じことを sed コマンドで実現する場合は、以下のように実行します。

sed 's|^.*\?foo\(.*\)bar.*\?$|\1|' test.txt

参考

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。

関連記事

Linux

VPSサービスのサーバーに sshでログインできない場合の対処法

VPSサービスのサーバーに sshでログインできない場合の対処法を紹介します。

CentOS

CentOS 8 標準の Apache と PHP の関係について

CentOS 8 における Apache と PHP の関係について説明します。

Linux

指定した条件にマッチするファイルを検索する find コマンド

find コマンドについて説明します。 ※ 本ページで扱うのは、find (GNU findutils) 4.7.0-git です。 目次1. find コマンドの使い方式 (EXPRESSION)式 …

Linux

sed コマンドの基本形式

sed コマンドの基本的な指定形式について説明します。

Linux

コマンドラインからメールを送信する方法

Linux (や Mac) のターミナルエミュレータ上からメールを送信するコマンドを紹介します。 目次1. sendmail2. mail3. telnet4. おわりに 1. sendmail se …