コマンド出力から部分文字列を抽出する

コマンド出力から部分文字列を抽出する

以下のコマンド出力からkimtinおよび部分文字列のみを抽出するにはどうすればよいですか?tintu単純な分割では部分文字列を取得できません-。ビットxxxは特定の演算子の文字列なので、ハッシュ処理します。

> kubectl get pods
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramkim-6b4c49f589-6hqcj       
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtin-8d49b4dc7-bmvck        
xxxxxxxxxxxxxxx-x-ram-kdm-xxxxx-ramtintu-69b8c5b689-64fxw 

申し訳ありません。クライアントの制限により、多くの情報を追加できません。出力の性格を説明します。 ramは、抽出する必要がある文字列に関連付けられた固定名です。各出力行の - の数は固定されておらず、文字もありません。この例では、ram は -ram- と表示されます。 ram + 'extract-string'が表示されるたびにリンクされた文字列を抽出するだけですが、一度だけ表示されます。

ベストアンサー1

あなたのコメントに基づいて更新すると、これがあなたの要件を満たすと思います。

$ awk -F- '{
    for (i=1;i<=NF;i++) {
      if ($i ~ "^ram.+") { sub("^ram","",$i); print $i} }
    }' kubectl.txt
kim
tin
tintu

英語:各入力行の各フィールドについて、フィールド値が正規表現^ram.+(「ram」で始まり、次に続く)と一致する場合最後のものより多くの文字)その後、sub()を使用してフィールドの先頭から「ram」を削除し、フィールドを印刷します。

またはPerlでは:

$ perl -F- -lne 'foreach (@F) { print $1 if (m/^ram(.+)/) }' kubectl.txt 
kim
tin
tintu

英語: 各行の各フィールドについて、フィールドが正規表現 "^ram(.+)" と一致する場合、サブ式に一致するフィールド(.+)のキャプチャ部分 (たとえば "^ram" の後のすべての項目) を印刷します。

注:行の複数のフィールドがこのパターンと一致すると、すべて印刷されます。最初のフィールドだけが必要な場合は、現在のnext行処理を停止して次の行に移動します。

awk -F- '{
    for (i=1;i<=NF;i++) {
      if ($i ~ "^ram.+") { sub("^ram","",$i); print $i; next } }
    }' kubectl.txt

または

perl -F- -lne 'foreach (@F) { if (m/^ram(.+)/) { print $1; next } }' kubectl.txt

同様の質問をしている他の読者にはまだ役に立つかもしれません。

正確にどの出力が欲しいのか分からないので、ここにいくつかの可能性があります。両方とも、フィールド6($6)がフィールド3()の内容で始まる行に対してのみ出力を生成します"^" $3。他のすべての行は無視されます。

kubectl.txtサンプル出力を含むテキストファイルkubectl get pods

フィールド6の部分文字列(文字4からフィールドの終わりまで):

$ awk -F- '$6 ~ "^" $3 { print substr($6,4) }' kubectl.txt 
kim
tin
tintu

フィールド6の削除を使用して、最初からフィールド3の内容を削除しますsub()。上記の例とは異なり、最初の3文字を削除するようにハードコードされていないため、$ 3の長さに関係なく機能します。

$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6}' kubectl.txt 
kim
tin
tintu

上記のフィールド7と8と同じで、スペースで区切られています。

$ awk -F- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt
kim 6b4c49f589 6hqcj
tin 8d49b4dc7 bmvck
tintu 69b8c5b689 64fxw

上記と同じですが、-区切り記号があります。

$ awk -F- -vOFS=- '$6 ~ "^" $3 { sub("^" $3,"",$6); print $6, $7, $8}' kubectl.txt 
kim-6b4c49f589-6hqcj
tin-8d49b4dc7-bmvck
tintu-69b8c5b689-64fxw

おすすめ記事