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

同じ行の2つの検索パターン間で値を抽出しますか?

Output.datファイルに次のものがあります。 dn: uid=の間の値を抽出する必要があります および,ou=

 dn: uid=user1,ou=Active,ou=Member,dc=domain,dc=org
 dn: [email protected],ou=Active,ou=Member,dc=domain,dc=org
 dn: uid=usertest,ou=Active,ou=Member,dc=domain,dc=org
 dn: uid=abc1,ou=Active,ou=Member,dc=domain,dc=org
  • sed -e '/dn: uid=/,/,ou=/p' output.dat but
    

    値ではなく完全な行を返します。

  • sed -e '/dn: uid=/,/,ou=/1/p' output.dat
    

    その後、次のエラーが発生しました:

    sed: -e expression #1, char 18: unknown command: `'
    

承認された回答:

PCRE(-P)を備えたバージョンのGNUgrepを使用している場合 )サポートし、最初のを意味すると仮定します ,ouの出現

grep -oP '(?<=dn: uid=).+?(?=,ou=)' file

まで一致させたい場合 ,ou 貪欲でない?を削除できます 修飾子

grep -oP '(?<=dn: uid=).+(?=,ou=)' file

括弧内の式は、長さがゼロのアサーション(別名 lookarounds )です。 )それらは一致の一部を形成しますが、結果の一部として返されません。同じことをperlでネイティブに行うことができます。例:

perl -ne 'print "$1n" if /(?<=dn: uid=)(.+?)(?=,ou=)/' file 

似たようなことをすることは可能です sedでは、通常の(長さがゼロではない)グループ化を使用します。 (GNU sedの場合–他の種類では追加のエスケープが必要になる場合があります)

sed -rn 's/(.*dn: uid=)([^,]+)(,ou=.*)/2/p' file

または少し単純化する

sed -rn 's/.*dn: uid=([^,]+),ou=.*/1/p' file

[^,]に注意してください sedには真の貪欲でない一致オプションがないため、ここでは少しハックします。

後付け :質問した内容とは異なりますが、実際に実行したいのは、カンマ区切りのname=valueを読み取ることです。 ファイルからペアを作成し、最初のフィールドの値をその名前からさらに分割します。これは、さまざまな方法で達成できます。たとえば、

awk -F, '{sub(".*=","",$1); print $1}' file

またはなどの純粋なbashソリューション

while IFS=, read -r a b c d; do printf '%sn' "${a#*=}"; done < file 

Linux
  1. 2つのパターン間の(および除外する)行を印刷しますか?

  2. 2つのパターンの間(およびそれを含む)の線を印刷しますか?

  3. ファイルの最初の行の前にテキストを挿入する方法は?

  1. コマンドラインを使用してLinuxでtar.gzファイルを抽出する方法

  2. Sedを使用してパターン範囲間の行を検索および置換

  3. sed:見つかった場合は行を置き換えるか、見つからない場合はファイルの最後に追加する方法は?

  1. 2つのタイムスタンプ間のログを抽出する方法は?

  2. 2つの異なる単語が存在するテキストファイルを検索しますか(任意の順序、任意の行)?

  3. 2つの特定の行の間にテキストを抽出しますか?