
そこで、メールで送られてきたログ (Windows 内) を調べて、モデルのシリアル番号を特定する行を探す必要があります。これを行う簡単な方法は、.msg を変換してファイルを読み取れるようにする見苦しいバッチ スクリプトを作成することだと考えました。例:
cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt
3 つの一意の数字が残るので、スペースまたは : を区切り文字として、行 1 に ALPHA、行 2 に BETA、行 3 に GAMMA を追加するにはどうすればよいですか?
アップデート:ファイルa21s.txt
は
0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414
答え1
あなたが探しているものを実行する方法はたくさんありますが、いくつか例を挙げます。
awk
カスタマイズされたソリューション
あなたの例に合わせた 1 つの解決策は、awk
3 つの変数を使用して渡すことです。4 行ある場合は 4 つの変数を渡す必要があるなど、これは一般的ではありません...
このコマンドには、列の番号 ( 、...最後の列) awk
を通じて列を管理する簡単な方法があります。$1
$2
$NF
ここでは読みやすくするために、古い中間ファイルを使用します
a21s.txt
awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" ' NR==1 {print s1,$7} ; NR==2 {print s2,$7} ; NR==3 {print s3,$7} ; ' a21s.txt
- 最初の行では、
awk
オプションを使用して 3 つの変数を渡します-v
。 - 次の行では、内部変数NRは行番号をカウントします。変数を印刷するにはs1最初の行がある場合のみ、s22番目も同様です。
- 最後の行では
'
ファイル名を指定できるので、cat
プロセスを呼び出してパイプする必要がありませんawk
。 - 変数 (ALPHA、BETA...) が何らかのメカニズム (例: "Serial01、Serial02") を使用して生成可能な場合は、行番号と外部変数のコントロールの代わりにそれを配置できます。
- 最初の行では、
実用的な注意:*nixでは命令列
|
中間ファイルを作成する必要なく、1 つの出力を次の出力にパイプします ( )。
したがって、例では直接使用できます。cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
cut
この場合、の代わりにawk
、 コマンド を使用できますcat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt
。
より一般的な解決策: paste
+awk
a21s.txt
ファイルと、b.txt
同じ行数でプレフィックスを付ける文字列(それぞれ 1 語)を含む別のファイル( )があるとします(次の例を参照)。
ALPHA
BETA
GAMMA
単に
paste b.txt a21.txt | awk '{print $1,$8}' > Air21Serials.txt
貼り付けの前に別の列を追加したため、シリアルの列が 8 番目になっていることに注意してください。
注記
Linux自体に問い合わせて、さらに詳しい情報を入手してくださいman awk
。man paste
:-)
答え2
エコーアルファ>agrep.txt ; cat "前.msg" | 文字列2>>agrep.txt
それは正確なラインではないかもしれません...コンセプトは、あなたが初めファイルに「Alpha」という単語を入れたいのですが、> 記号を使用してファイルを作成し、>> を使用してファイルに追加します。「改行」がなければ、そこに ALPHA という単語を入れてから、最初のメッセージを追加する必要があります。
コードを正確に動作させるには、少し試してみる必要があるかもしれません。
編集: 検索すると、猫そしてプリントechoはOSによって異なる可能性があるため、echoよりも優れたオプションです。
例: cat ("ALPHA: ") > agrep.txt ; cat "前.msg" | 文字列2>>agrep.txt
そして、「ワンライナー」コマンドを実行するには、最初のパイプは ; または && であるべきでした。
; 中間のコマンドは常に次のコマンドを実行します && コマンド間は、前のコマンドが成功した場合にのみ次のコマンドを実行し、|| (二重パイプ) は前のコマンドが失敗した場合にのみ次のコマンドを実行します
答え3
入力がどのようなものかよくわからないstrings2
ので、これが期待通りに動作するかどうか100%確信できません。しかし、少なくとも正しい方向を指し示すことになるかもしれません。stdincat
からの入力を受け入れることができます。したがって、次のようにすることもできます。
echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt