2017-06-06 8 views
0

謝罪この私の最初の投稿です、あなたはそれを理解することを願っなどファイル出力操作 - 理想的に事前に1行で

オリジナルファイル

cat trail 
PROC_Create  root  OK   Mon Jun 05 16:05:45 2017 bash       Global 
    forked child process 31522922 
PROC_Execute root  OK   Mon Jun 05 16:05:45 2017 audit       Global 
    euid: 0 egid: 0 epriv: ffffffff:ffffffff name audit shutdown 


vi and :set list 

PROC_Create  root  OK   Mon Jun 05 16:05:45 2017 bash       Global     $ 
    forked child process 31522922$ 
PROC_Execute root  OK   Mon Jun 05 16:05:45 2017 audit       Global     $ 
    euid: 0 egid: 0 epriv: ffffffff:ffffffff name audit shutdown $ 


cat trail | oc -d 
0226220      G l o b a l 
0226240                \n 
0226260         f o r k e d  c 
0226300 h i l d  p r o c e s s  3 1 5 
0226320 2 2 9 2 2 \n P R O C _ E x e c u 
0226340 t e     r o o t      O 
0226360 K           M o n  J 
0226400 u n  0 5  1 6 : 0 5 : 4 5  2 
0226420 0 1 7  a u d i t 
0226440 
0226460     G l o b a l 
0226500               \n 
0226520        e u i d :  0  e 
0226540 g i d :  0  e p r i v :  f f 
0226560 f f f f f f : f f f f f f f f 
0226600 n a m e  a u d i t  s h u t d 
0226620 o w n  \n 
0226625 

所望の出力理想的にはいくつかのツールを使用して

私はsed/tr/awkなどのトレイルファイルをパイプすることができます。

PROC_Create  root  OK   Mon Jun 05 16:05:45 2017 bash       Global  forked child process 31522922 
PROC_Execute root  OK   Mon Jun 05 16:05:45 2017 audit       Global  euid: 0 egid: 0 epriv: ffffffff:ffffffff name audit shutdown 

または

PROC_Create  root  OK   Mon Jun 05 16:05:45 2017 bash  forked child process 31522922 
PROC_Execute root  OK   Mon Jun 05 16:05:45 2017 audit  euid: 0 egid: 0 epriv: ffffffff:ffffffff name audit shutdown 

私は、キャリッジリターンと単語グローバルを削除するためにうまく管理しているが、ちょうどインチ事前に感謝し、グローバルでの行に改行を削除し、および/またはグローバルに苦労しています。

私は次のように使用している:

sed 's/Global//g' 
tr -d '\n' 

が、SEDでそれをすべて行うには期待していたが、改行を削除しようとしたとき、それは仕事を得ることができませんでした。

cat trail | sed ':label;N;s/Global[ \n]*//;N;b label'

EDIT1:labelNでファイル

S_PASSWD_READ root  OK   Mon Jun 05 16:05:37 2017 su        Global 
    audit object read event detected /etc/security/passwd 
S_PASSWD_READ root  OK   Mon Jun 05 16:05:37 2017 su        Global 
    audit object read event detected /etc/security/passwd 
FILE_Write  root  OK   Mon Jun 05 16:05:37 2017 su        Global 
    file descriptor = 5 filename = 
FILE_Write  root  OK   Mon Jun 05 16:05:37 2017 su        Global 
    file descriptor = 3 filename = 
PROC_Execute root  OK   Mon Jun 05 16:05:37 2017 ksh        Global 
    euid: 0 egid: 0 epriv: ffffffff:ffffffff name -ksh 
PROC_Create  root  OK   Mon Jun 05 16:05:37 2017 ksh        Global 
    forked child process 40763616 
PROC_Execute root  OK   Mon Jun 05 16:05:37 2017 termdef       Global 
    euid: 0 egid: 0 epriv: ffffffff:ffffffff name termdef 
+0

'キャリッジリターンと単語「グローバル」を削除して問題のコードを追加してください。あなたが解決しようとした努力に追加されます.. – Sundeep

答えて

0

注:すべての入力を仮定すると、一対の第二線はペアの最初の行の末尾に付加される2線対から成ります。

カップル(単純な)awkの例では、ボールの転がりを得るために:小文字(

awk '/^[a-zA-Z]/ {printf $0} /^/{print $0}' trail 

- または -

awk '/^[[:alpha:]]/ {printf $0} /^[[:space:]]/ {print $0}' trail 

まず、検索パターンが手紙を持っている行を探しているのか、大文字)を最初の位置に置きます。見つかった場合は、printfを使用して、行全体を出力しますが、末尾にを付けずにを出力してください。

第2の検索パターンは、第1の位置のスペースとして行を探しています。見つかった場合は、プリントを使用して、の末尾に改行を出力します。

2番目の検索パターン解消するRavinderSingh13のgetlineのアイデアを借用

:次の行を読んで、キャリッジリターンなし出力行全体 printfの文字を使用で始まる行ごとに

awk '/^[[:alpha:]]/ {printf $0 ; getline ; print}' trail 

を、プリント全ライン最後にキャリッジリターン。

0

使用sed

より大きいサンプルは次のように、助けることができるかもしれ

cat trail | sed ' 
:label; 
N; 
s/Global[ \n]*//; 
N; 
b label' 
+0

cat trail |sed:ラベル:ラベル; N; s /グローバル[\ n] * //; N; bラベルは大きいです。 8文字以上です。 ありがとうございますが、かなり動作していません...... – Neil

+0

@Neil、おそらく非GNU sedがありますが、これは私の計算機でうまく動作します。このコマンドを別々の行で試してみてください。 – Mikiya

0

試み:文字列PROCで始まる行を探してい

awk '/^PROC/{sub(/[[:space:]]+Global/,"");val=$0;getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,$0)}' Input_file 

、NULLを持つグローバル文字列までこれが事実であるならば、代替スペース、ヴァルに現在の行の値を格納します。 getlineを使って次の行にジャンプします。次に、行の最初のスペースを置き換えて、valと現在の行の値をそれらの間にTABで表示します。

EDIT1: OPのリクエストごとにコードを変更しました。

awk '!/^[[:space:]]/{sub(/[[:space:]]+Global/,"");val=$0;getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,$0)}' Input_file 
+0

残念ながら、すべての行がprocで始まるわけではありません。各行の開始は、50以上の異なる文字列にすることができます。新しいファイルサンプルが元の投稿に追加されました。どうぞご覧ください。 – Neil

+0

各行が最後にGlobalを持ち、2行目が開始時にスペースを持つことを考慮して、EDIT1セクションでコードを変更しました。もっと条件があれば、親切にも同じことを私たちに知らせてください。 – RavinderSingh13

関連する問題