変数にこのストアがあります
sCellEventTrap-03-28 TRAP-TYPE-CAC Code:00 ENTERPRISE compaq VARIABLES {scellNameDateTime、 scellSWComponent、 scellECode、[ .____。 " -#TYPE" StorageCell Event " -#SUMMARY" SCellName-TimeDate%s:SWCID%d:ECode:%d:CAC%d:EIP%d。 " -#ARGUMENTS {0,1,2,3,4、} -#SEVERITY INFORMATIONAL -#TIMEINDEX 136 -#STATE WARNING :: = 13600808
私は"
の2番目の出現まですべてをカットします。だからそれは私に与えます:
sCellEventTrap-03-28 TRAP-TYPE-CAC Code:00 ENTERPRISE compaq VARIABLES {scellNameDateTime、 scellSWComponent、 scellECode、[ .____。 「
もう一つの例
genericSanEvent TRAP-TYPE ENTERPRISE hpSanManager VARIABLES {severityLevel、category、id、 msgString、contactName、contactEmail、 contactWorkPhone、contactHomePhone、 contactPager、contactFax} DESCRIPTION "汎用SANイベントが発生しました。変数は次のとおりです。 severityLevel-イベントの重大度レベル; category-報告されているイベントのカテゴリ; code-指定されたカテゴリのイベントのID; msgString-イベントを説明する メッセージ文字列; contactName-イベントの通知を受ける個人の名前 ; contactEmail -contactNameで参照される 個人の電子メールアドレス; contactWorkPhone- contactNameで参照される個人の勤務先電話番号 。 ____。] contactHomePhone- contactNameで参照される個人の自宅電話番号 ; contactPager-contactNameで参照される 個人のポケットベル番号。 contactFax-個人のFAX番号 contactNameで参照されます " -以下は、xnmloadmibがフォーマットを改善するために使用する属性です -#TYPE OV SAM SANイベント " -#SUMMARY" OV SAM SANイベント、カテゴリ/ I d:%d /%d、メッセージ:%d重大度:%d連絡先:%d " -#ARGUMENTS {1,2,3,0,4} -#SEVERITY CRITICAL -#GENERIC 6 -#CATEGORY "アプリケーションアラートイベント" -#SOURCE_ID "T" :: = 1
この例の出力は次のようになります。
genericSanEvent TRAP-TYPE ENTERPRISE hpSanManager VARIABLES {severityLevel、category、id、 msgString、contactName、contactEmail、 contactWorkPhone、contactHomePhone、 contactPager、contactFax} DESCRIPTION "汎用SANイベントが発生しました。変数は次のとおりです。 severityLevel-イベントの重大度レベル; category-報告されているイベントのカテゴリ; code-指定されたカテゴリのイベントのID; msgString-イベントを説明する メッセージ文字列; contactName-イベントの通知を受ける個人の名前 ; contactEmail -contactNameで参照される 個人の電子メールアドレス; contactWorkPhone- contactNameで参照される個人の勤務先電話番号 。 ____。] contactHomePhone- contactNameで参照される個人の自宅電話番号 ; contactPager-contactNameで参照される 個人のポケットベル番号。 contactFax-contactNameで参照される個人のFAX番号 "
awk -v RS='"' -v ORS='"' 'NR==1{print} NR==2{print; printf"\n";exit}' file
これにより、レコード区切り文字が"
に設定されます。したがって、最初の2つのレコードを印刷して、完了です。さらに詳細に:
-v RS='"'
これにより、入力レコードの区切り文字が二重引用符に設定されます。
-v ORS='"'
これにより、出力レコード分離文字が二重引用符に設定されます。
NR==1{print}
これは、awkに最初の行を印刷するよう指示します。
NR==2{print; printf"\n";exit}
これは、awkに2行目を印刷し、改行文字を印刷してから終了するように指示します。
sed -r 'H;1h;$!d;x; s/(([^"]*"){2}).*/\1/' file
これにより、ファイル全体が一度に読み込まれます。そのため、ファイルが大きい場合は、このアプローチを使用しないでください。次のように機能します。
H;1h;$!d;x
これは便利なsedイディオムです。ファイル全体を一度に読み込みます。
s/(([^"]*"){2}).*/\1/
これは2番目の"
を探し、2番目の引用符に続くすべてのテキストを削除します。
正規表現(([^"]*"){2})
は、2番目の二重引用符までのすべてのテキストをキャプチャし、グループ1に保存します。正規表現.*
は、ファイルの最後まで続くすべてをキャプチャします。置換テキストはグループ1、\1
です。
以下に、小さなpython
スクリプトを示します。
#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
print '"'.join(f.read().split('"')[:2]) + '"'
f.read().split('"')
はファイル全体を文字列として読み取り、"
で分割してすべての"
で区切られた部分を取得します
最初の2つの"
で区切られた部分のみに関心があるため、'"'.join(f.read().split('"')[:2])
は最初の2つを"
で結合します
次に、"
を追加して、目的の形式を取得しました。
多くのプログラムは入力として非常に長い行を好まないが、データが大きくない場合は、多くの場合単純化できます複数行一致最初にデータを操作してすべてを1行に配置し、次に一致を実行してから、改行を復元します。
たとえば、trを使用して改行\n
をデータにない文字で置き換え(キャリッジリターン '\ r'を使用)、sedを使用してこの単一行を変更し、次に文字をtrに戻します。
tr '\n' '\r' < file |
sed 's/\("[^"]*"\).*/\1/' |
( tr '\r' '\n'; echo ) # add a final newline
それ以外の場合、sed/awk/grepが必要であると言いますが、Perlやpythonなどの言語はこれらと同様の正規表現を使用し、複数行の文字列を操作するのに適しています。例:Perl:
Perl -e '$_ = join("",<>); s/(".*?").*/$1/s; print "$_\n"; ' file
Perlの使用:
< infile Perl -0777 -pe 's/((.*?"){2}).*/$1/s' > outfile
-0777
:一度に1行ではなく、ファイル全体を一度に丸lurみします-p
:スクリプトの周りにwhile (<>) {[...]}
ループを配置し、処理されたファイルを出力します-e
:引数からスクリプトを読み取りますPerlコマンドの内訳:
s
:置換を実行するようにアサートします/
:パターンを開始します((.*?"){2})
:"
文字の前に、現在のファイル内で任意の数の文字を0回以上遅延して一致(グループ化)します(つまり、次のパターンが一致し始めると停止します) 、二度.*
:現在のファイル内の任意の数の任意の文字と0回以上一致します(つまり、可能な限り最も一致します)。/
:パターンを停止/置換文字列を開始$1
:最初にキャプチャされたグループに置き換えます/
:置換文字列を停止する/修飾子を開始するs
:ファイル全体を1行として扱い、.
が改行にも一致するようにします短いawk
バージョン:awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ '
$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile.txt
sCellEventTrap-03-28 TRAP-TYPE -- CAC Code: 00
ENTERPRISE compaq
VARIABLES { scellNameDateTime,
scellSWComponent,
scellECode,
scellCAC,
scellEIP}
DESCRIPTION
"Severity: Normal -- informational in nature. A physical disk drive has experienced an ID block inconsistency during a periodic drive check."
$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile2.txt
genericSanEvent TRAP-TYPE
ENTERPRISE hpSanManager
VARIABLES { severityLevel, category, id,
msgString, contactName, contactEmail,
contactWorkPhone, contactHomePhone,
contactPager, contactFax }
DESCRIPTION
"A generic SAN event has occurred. The variables are:
severityLevel - the event severity level;
category - Category of the event being reported;
code - ID of the event in the given category;
msgString - the message string describing
the event;
contactName - the name of the individual
to be notified of the event;
contactEmail - the e-mail address of the
individual referred to in contactName;
contactWorkPhone - the work phone number
of the individual referred to in
contactName;
contactHomePhone - the home phone number
of the individual referred to in
contactName;
contactPager - the pager number of the
individual referred to in contactName;
contactFax - the FAX number of the individual
referred to in contactName"