Awk 文件输出操作-理想情况下在一行中

Awk 文件输出操作-理想情况下在一行中,awk,sed,cut,tr,Awk,Sed,Cut,Tr,提前道歉这是我的第一篇帖子,希望你能理解 原始文件 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

提前道歉这是我的第一篇帖子,希望你能理解

原始文件

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

我已经设法删除了回车符和单词Global,但是我正在努力删除Global in行中的回车符和/或Global。提前谢谢

我使用了以下方法:

sed 's/Global//g'
tr -d '\n'
但他希望能和sed一起完成这一切,但在试图移除马车返回时却无法让它工作

文件的较大样本

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

一起使用
sed
:label
N
可能会有所帮助,例如:


cat trail | sed”:标签;Ns/Global[\n]*/;Nb标签“

Edit1

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

查找以字符串PROC开头的行,如果是这种情况,则将空格替换为NULL,直到字符串全局,将当前行的值存储到val中。然后使用getline跳转到下一行。现在替换行中的初始空格,然后打印val和当前行的值,并在两者之间添加TAB

EDIT1:现在根据OP的请求更改代码

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

注:假设所有输入由两行对组成,其中一对中的第二行附加到该对中第一行的末尾

下面是几个(简单化的)awk示例,让您了解情况:

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

第一个搜索模式是寻找第一个位置有字母(小写或大写)的行;如果找到,则使用printf输出整行,但在末尾不带回车符

第二搜索模式是寻找在第一位置作为空间的线;如果找到,请使用打印输出整行,并在结尾处返回一个回车符


借用RavinderSingh13的getline思想消除第二种搜索模式:

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

对于以字符开头的每一行,使用printf输出整行而不使用回车符,阅读下一行,print整行并在结尾使用回车符。

删除回车符和单词Global
将该代码添加到问题中。。这将增加您为解决……猫踪迹(sed):标签;Ns/Global[\n]*/;Nb标签sed:标签:标签;Ns/Global[\n]*/;Nb标签大于八个字符。谢谢,但不太好用……@Neil,你可能没有使用GNU,这在我的电脑上很好用。请在单独的行上尝试此命令。不幸的是,并非所有行都以proc开头,这是我的错误,因为没有提供足够的详细信息订阅。每行的开头可以是50多个不同的字符串。新文件样本添加到原始帖子。请你再看一看。考虑到每一行的末尾都有全局代码,第二行的开头也有空格,我现在修改了EDIT1部分的代码。如果您有更多的条件,请在同一天告诉我们。
awk '/^[a-zA-Z]/ {printf $0} /^ / {print $0}' trail
awk '/^[[:alpha:]]/ {printf $0} /^[[:space:]]/ {print $0}' trail
awk '/^[[:alpha:]]/ {printf $0 ; getline ; print}' trail