bash:動的列のgrepコンテンツ

bash:動的列のgrepコンテンツ

次のデータがあります。

ここに画像の説明を入力してください。

私が得なければならないのはOS_NATIVE_NAME具体的ですDEVICE

1 つの方法は、次を使用して列値を印刷することです。

awk '{print $*col_num*}'

ただし、シリアル番号はOS_NATIVE_NAME固定されていません。これは、異なるフィールド(たとえば)が異なる値(複数の場合があります)を持つ可能性があるため、テストに必要なデータである固定列STATUS番号がない問題につながるためです。OS_NATIVE_NAME

特定の列の内容をどのように把握しますか?

ベストアンサー1

そしてawk

awk 'NR==1{for(i=1;i<NF;i++){if($i=="OS_NATIVE_NAME"){s=index($0,$i); l=index($0,$(i+1))-s}}}
 $1=="disk_0"{print substr($0,s,l)}' file
  • NR==1最初の行(ヘッダー行)の場合は、NR現在処理中の行番号のawks内部変数です。
    • for(i=1;i<NF;i++)フィールドを繰り返します。NF現在行のフィールド数を表す awks 内部変数です。
    • $i=="OS_NATIVE_NAME"なぜなら、各フィールドを繰り返して、フィールド値が次のようになっていることを確認するからです。OS_NATIVE_NAME
    • s=index(...)フィールドが始まる場所を見つけて、後で使用できるように保存します。index()別の文字列(ここでは行全体)内で文字列(ここでは$ i値OS_NATIVE_NAME)が表示される位置を取得するawks文字列関数。$0
    • l=index(...)-sフィールドの長さを取得し、後で使用するために保存します。前と同じ原理ですが、長さを得るにはsフィールドから減算する必要があります。
  • $1=="disk_0"DEVICEdisk_0最初のフィールド(例)で検索したいものを見つけます。$1最初のフィールドを表します。
    • {print substr($0,s,l)}最後に、各行を印刷すると、文字列はpositionから始まり、s長さを持ちますlsubstr()長さのある場所(行1の処理中に以前に抽出した2つの変数)から文字列(ここでは行全体$0)を切り取るawks文字列関数。sl

印刷(入力のフィールド位置に関係なく):

sda

おすすめ記事