使用できる独自のASCII文字を作成することは可能ですか?では、どうすればよいですか?
#12345
今私のユースケースは次のとおりです。役割を作成し、私が作成したいくつかのスクリプトのカスタムログを生成し、各フィールドを新しい役割に分割したいとします。たとえば、次のようになります。
ID #12345 Host #12345 User #12345 Message #12345 Timestamp
1 #12345 host1 #12345 user1 #12345 This user did this this and that #12345 11:11:11
2 #12345 host1 #12345 user2 #12345 This other user did this new thing #12345 11:11:51
だから私がカスタム文字を望む理由は、各フィールドのテキストにすべての文字を含めることができることを望み(そして私のカスタム文字がある可能性はほとんどありません)、何awk -F '#12345' '{print $4}'
に関係なくメッセージでawkを使用して簡単に操作できますあるからです。実際にはメッセージにありますが、キーと値のペア,
の間にあり、メッセージにもある可能性が,
あるため、通常はjson形式の出力に問題があります。
私の質問は「jsonを解析する方法」ではないので冗長ではなく、私のユースケースにすぎません。私の質問は、私が使用できるカスタム文字を作成することです。
答え1
特定の質問に対する可能な唯一の答えは「いいえ。ASCII文字は0〜127の値を持つ事前定義された7ビット文字セットであり、各値には特定の意味が割り当てられています。追加または変更する範囲はありません。それらを」。
しかし、それはあなたが本当に尋ねたい質問ではないようです。すべての入力データに対して動作が保証される一意の区切り文字があるかどうか(または存在できるかどうか)を知りたいです。
通常、答えは「いいえ」です。不可能で存在しません。
ただし、特定の状況(つまり、既知または簡単に見つかった特性を持つ入力データ)では、データフィールドで見つけることができないか不可能であることを保証する文字を見つけることが可能な場合がよくあります。
ほとんどの人はTABを「データに表示できない」区切り文字として使用します。 :
コロンが一般的に使用される時間フィールドやその他のデータがない場合は、広く使用されています(例:/ etc / passwd)。そして、カンマはさまざまな状況で使用できます。
一部の人は正しい形式のCSV(例:そして区切り文字を含むことができる文字列フィールドの周囲には引用符があります。他のものはJSON、XML、またはその他の構造化テキスト形式を使用します。ここでデータを正確に抽出するには、良いパーサーが必要です。
理論的には、bashでそのようなパーサーを書くことができます。実際には実際には望んでいません。作業に適したツールを使用するよりもはるかに多くの作業が必要です。あるいは、遅くて非常に限られた良いパーサーを書くよりも、正しい言語(C、Perl、またはPython)を使用するよりもはるかに多くの作業が必要です。 bashのような言語)
追加情報:他の質問では、bashスクリプトで「サードパーティツール」を使用する際に問題があると思うようです。それは本当ではありません。シェルスクリプトは、さまざまなサードパーティツール間の「接着剤」と「調整者」として機能します。これがsh / bashがうまくいくことです。
答え2
ASCIIではなくUNICODEを意味すると仮定すると、解決策は次のとおりです。Unicode文字データベース。
FAQの「基本的な質問」を見ると、あなたの目標は未割り当ての役割を使用するようです。これは明らかに「個人使用領域」内になければなりません。「一貫したUnicodeの実装」。
詳細情報(例:FAQが多すぎるため)ねえ。
答え3
示されているように、ログファイルを解析することはそれほど難しくないようです。いいえマジックセパレータを提案します#12345
。この提案が満足できないという点を先に指摘する」と話した。各フィールドのテキストにすべての文字を含めることができるようにしたいです。しかし、とにかく私はホスト名、ユーザー名、タイムスタンプに基づいてこれを提案したいと思います。おそらくスペースはありません。
cat log
ID Host User Message Timestamp
1 host1 user1 This user did this this and that 11:11:11
2 host1 user2 This other user did this new thing 11:11:51
while IFS=' ' read -r id host user message
do
timestamp="${message##* }" message="${message% *}"
printf "%s - %s - %s - %s - %s\n" "$id" "$host" "$user" "$message" "$timestamp"
done <log
ID - Host - User - Message - Timestamp
1 - host1 - user1 - This user did this this and that - 11:11:11
2 - host1 - user2 - This other user did this new thing - 11:11:51