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

Linux のコマンドラインで発生するビープ音を消す

Linux のコマンドでビープ音を消す方法を紹介します。

docker

CentOS 上の Docker にウェブサーバーを入れて80番以外のポートで公開することができない問題【未解決】

CentOS 7 上の Dockerコンテナ にウェブサーバーを入れた場合、80番以外のポートで公開することはできないようです。 例えば、 まず、firewall-cmd コマンドで 8080番ポート …

Linux

known_hosts ファイル内のハッシュ化されたホスト名(IPアドレス)を自分で算出する

known_hosts ファイル内のハッシュ化されたホスト名(IPアドレス)を自分で算出する方法を紹介します。

Linux

パターンにマッチした行を表示する grep コマンド

目次1. はじめに2. 主な使い方3. その他のオプション4. 正規表現について 1. はじめに grep は、対象ファイルの中で、指定した文字列パターンにマッチした行を表示するコマンドです。 ※ 本 …

Let's Encrypt

Let’s Encrypt で ‘-0001’ がついた証明書データを削除する方法

目次1. 問題点2. 対応方法念のため、存在している証明書を全て表示します。いらない証明書データを削除する3. 間違えて生成した ‘-0001’ の方を Webサイトで使用して …