次のawkコードセクションには、ファイル名と完全なLinuxパスが含まれています。これには、日付file
型ディレクトリとしてYYMMDDを含めることができます。backup-YYMMDD
isDate[file]
つまり、YYMMDDを割り当てたいのですisDate[file]=YYMMDD
。
どうすればいいですか?
for (file in files) {
if ( file ~ /(^|\/)(library|labs data|current)(\/|$)/ ) {
isKeep[file]
}
else if ( file ~ /(^|\/)(backup-[0-2][0-9][0-1][0-9][0-3][0-9])(\/|$)/ ) {
isDate[file]
}
else {
isDelete[file]
}
}
ベストアンサー1
GNUには、パターンとして特徴付けられる文字列コンポーネントの実際の値を抽出するためのコマンドがawk
あります。match
だからあなたは使用することができます
match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats);
isDate[file]=pats[1]
else if ....
プログラムの一部です。 (配列)変数は、次から始まり、pats
すべてのRegExp(...)
の文字列に含まれるすべてのサブ式で埋められます。インデックス1(pats[0]
実際の値になります。みんな表現する)。グループ化された(backup-YYMMDD
部分的に)1つのサブ式のみがあるため、探してpats[1]
いるものが含まれます。
または、単に試してみることができます
...
else if (match(file,"^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$",pats)==1) {
isDate[file]=pats[1]
}
...
もちろん、このアプローチは次の点に依存します。単一パターンのパスコンポーネントを含みますbackup-YYMMDD
。
編集する(OPのコメント、@macxpat)
"^[[:print:]] ... $"
この回答では、正規表現を指定するために文字列定数()を使用しました。しかし、次のようにGNU Awkユーザーガイド、正規表現定数として指定する方がよりきれいで効率的です。。したがって、活用する方が良いです。
match(file,/^[[:print:]]*(backup-[0-2][0-9][0-1][0-9][0-3][0-9])[[:print:]]*$/,pats)
上記の例では!