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

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

xdebug

Ubuntu 16.04.3 LTS + PHP 7.2 の環境に Xdebug をインストールする

2018年1月29日に、Xdebug 2.6.0 (stable版) がリリースされました。 Homestead にもまた Xdebug がデフォルトでインストールされるようになるのではないかと思いま …

Let's Encrypt

Let’s Encrypt でワイルドカードを使う

手持ちの CentOS 7 に入れてある certbot パッケージが バージョン 0.22.0 になり、Let’s Encrypt のワイルドカードに対応しましたので試してみました。 目 …

Let's Encrypt

Let’s Encrypt を使ってみました

無料でSSL証明書が発行できる Let’s Encrypt を使ってみました。 その時の操作手順を紹介します。 本記事執筆時に存在していた「Let’s Encrypt 総合ポー …

Google App Engine

Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする

Ubuntu 18.04 (WSL) に、Google Cloud SDK をインストールする手順を紹介します。

CentOS

CentOS 8 で spacewalk を削除する

目次1. spacewalk に関する警告が表示される2. spacewalk を削除する3. 参考 1. spacewalk に関する警告が表示される 2020年のある日、CentOS 8 で dn …