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

tree コマンドの結果を適切に表示する

tree コマンドの結果を適切に表示する方法を紹介します。

Linux

ドキュメントルートに chmod コマンドを実行する際、指定すると便利なモード引数

目次1. はじめに2. chmod に関する前提知識3. ディレクトリは rwxr-xr-x ファイルは rw-r–r– にする解説4. ディレクトリは rwxrwxr-x ファイルは rw-rw …

Linux

標準エラー出力を標準出力に向けるコマンド

Linux のターミナルにおいて、標準エラー出力を標準出力に向けるコマンドの記述方法を紹介します。

Linux

Ubuntu ではユーザー名に大文字が使えません(デフォルトでは)

Ubuntu で ユーザーを追加するには adduser というコマンドを使います。 例えば、”foo” という名前のユーザーを追加するには、以下のコマンドになります。 $ a …

Let's Encrypt

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

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