文件输出操作 - 最好在同一行

问题描述:

道歉提前,这是我的第一篇文章,希望你能理解等文件输出操作 - 最好在同一行

原始文件

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 

我已经manged只是删除回车和单词全球,但我在努力只是删除的行与全球的。在此先感谢回车和/或全球。

我已经使用了以下内容:

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

,但希望与SED做这一切,但不能得到它试图删除回车时工作。与: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

'删除回车和单词Global'将该代码添加到问题..它将增加你已经做出的努力来解决.. – Sundeep

注意:假设所有输入由将一对的第二行被附加到在该对第一行的末尾2线对。

一对夫妇(简单)awk的例子让球滚动:

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

- 或 -

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

第一搜索模式正在寻找具有信行(或较低大写)在第一个位置;如果找到,则使用printf输出整行,但不带回车结束。

第二种搜索模式是寻找一条线作为第一个位置的空间;如果找到,请使用打印输出整行回车结束。


借用RavinderSingh13的函数getline想法,以消除第二搜索模式:

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

对于每一个有一个字符用开始的printf输出全线没有一个回车换行,读下一行,打印整行回车结束。

使用sed

较大的样本可以帮助,如:

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

EDIT1

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

cat trail | sed':label; N; s/Global [\ n] * //; N; b label' sed:The label:label; N; s/Global [\ n] * //; N; b label is greater超过八个字符。 感谢但不是很努力...... – Neil

+0

@尼尔,你可能有非GNU sed,这对我的计算机工作正常。在单独的行上尝试此命令。 – Mikiya

尝试:

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

寻找与字符串PROC开头的行,如果是这种情况,那么替代的空间,直到串全球有NULL,存储当前行的价值为VAL。然后使用getline跳到下一行。现在用行代替最初的空格,然后在它们之间用TAB打印val和当前行的值。

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,第二行在开始时会有空格,所以我现在在EDIT1部分修改了我的代码。如果你有更多的条件,那么请让我们知道。 – RavinderSingh13