【问题标题】:File output manipulation - ideally in one line文件输出操作 - 理想情况下在一行
【发布时间】:2017-11-07 05:54:54
【问题描述】:

提前致歉,这是我的第一篇文章,希望你能理解它等等。

原始文件

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

我已经设法删除了回车符和 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

【问题讨论】:

  • remove the carriage returns and the word Global 将该代码添加到问题中..它将增加您为解决问题所做的努力..

标签: awk sed cut tr


【解决方案1】:

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

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

编辑1

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

【讨论】:

  • 猫迹 | sed ':label;N;s/Global[ \n]*//;N;b label' sed: 标签:label;N;s/Global[ \n]*//;N;b label 大于八字。谢谢,但不太好用......
  • @Neil,您可能有非 GNU sed,这在我的计算机上运行良好。在单独的行上尝试此命令。
【解决方案2】:

尝试:

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

查找以字符串 PROC 开头的行,如果是这种情况,则将空格替换为字符串 Global 与 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

【讨论】:

  • 不幸的是,并非所有行都以 proc 开头,我的错是没有提供足够详细的订阅。每行的开头可以是 50 多个不同的字符串。新文件示例添加到原始帖子。请你再看看。
  • 考虑到每行末尾都有 Global 并且第二行开始时有空格,我现在已经在 EDIT1 部分修改了我的代码。如果您有更多条件,请同时告知我们。
【解决方案3】:

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

几个(简单的)awk 示例可以让事情顺利进行:

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

-或-

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

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

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


借用 RavinderSingh13 的 getline 思路消除二次搜索模式:

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

对于以字符开头的每一行,使用 printf 输出整行不带回车,读取下一行,打印整行结尾有回车。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多