文件输出操作——最好在一行中
File output manipulation - ideally in one line
提前致歉,这是我的第一次post,希望您能理解等等
原始文件
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
我设法删除了回车 returns 和 Global 这个词,但我正在努力删除回车 return 和/或与 Global in 行中的 Global。谢谢提前。
我用过以下:
sed 's/Global//g'
tr -d '\n'
但希望用 sed 完成这一切,但在尝试移除马车时无法让它工作 returns。
更大的文件样本
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 ':label;N;s/Global[ \n]*//;N;b label'
编辑 1:
cat trail | sed '
:label;
N;
s/Global[ \n]*//;
N;
b label'
尝试:
awk '/^PROC/{sub(/[[:space:]]+Global/,"");val=[=10=];getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,[=10=])}' Input_file
寻找以字符串 PROC 开头的行,如果是这种情况,则将 space 直到字符串全局替换为 NULL,将当前行的值存储到 val 中。然后使用 getline 跳转到下一行。现在从行中替换初始的 space,然后用 TAB 打印 val 和当前行的值。
EDIT1: 现在根据 OP 的要求更改代码。
awk '!/^[[:space:]]/{sub(/[[:space:]]+Global/,"");val=[=11=];getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,[=11=])}' Input_file
注意:假设所有输入都由 2 行对组成,其中一对的第二行附加到第一行的末尾。
几个(简单的)awk 示例来启动:
awk '/^[a-zA-Z]/ {printf [=10=]} /^ / {print [=10=]}' trail
-或-
awk '/^[[:alpha:]]/ {printf [=11=]} /^[[:space:]]/ {print [=11=]}' trail
第一个搜索模式是寻找第一个位置有字母(小写或大写)的行;如果找到,使用 printf 输出整行,但 没有 末尾的回车 return。
第二个搜索模式正在寻找第一个位置为 space 的行;如果找到,使用 print 输出整行 并在末尾添加一个回车符 return 。
借用 RavinderSingh13 的 getline 思想来消除第二个搜索模式:
awk '/^[[:alpha:]]/ {printf [=12=] ; getline ; print}' trail
对于以字符开头的每一行,使用printf输出整行没有回车return,继续阅读line, print 整行 with 一个马车 return 在末尾。
提前致歉,这是我的第一次post,希望您能理解等等
原始文件
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
我设法删除了回车 returns 和 Global 这个词,但我正在努力删除回车 return 和/或与 Global in 行中的 Global。谢谢提前。
我用过以下:
sed 's/Global//g'
tr -d '\n'
但希望用 sed 完成这一切,但在尝试移除马车时无法让它工作 returns。
更大的文件样本
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 ':label;N;s/Global[ \n]*//;N;b label'
编辑 1:
cat trail | sed '
:label;
N;
s/Global[ \n]*//;
N;
b label'
尝试:
awk '/^PROC/{sub(/[[:space:]]+Global/,"");val=[=10=];getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,[=10=])}' Input_file
寻找以字符串 PROC 开头的行,如果是这种情况,则将 space 直到字符串全局替换为 NULL,将当前行的值存储到 val 中。然后使用 getline 跳转到下一行。现在从行中替换初始的 space,然后用 TAB 打印 val 和当前行的值。
EDIT1: 现在根据 OP 的要求更改代码。
awk '!/^[[:space:]]/{sub(/[[:space:]]+Global/,"");val=[=11=];getline;sub(/^[[:space:]]+/,"");printf("%s\t%s\n",val,[=11=])}' Input_file
注意:假设所有输入都由 2 行对组成,其中一对的第二行附加到第一行的末尾。
几个(简单的)awk 示例来启动:
awk '/^[a-zA-Z]/ {printf [=10=]} /^ / {print [=10=]}' trail
-或-
awk '/^[[:alpha:]]/ {printf [=11=]} /^[[:space:]]/ {print [=11=]}' trail
第一个搜索模式是寻找第一个位置有字母(小写或大写)的行;如果找到,使用 printf 输出整行,但 没有 末尾的回车 return。
第二个搜索模式正在寻找第一个位置为 space 的行;如果找到,使用 print 输出整行 并在末尾添加一个回车符 return 。
借用 RavinderSingh13 的 getline 思想来消除第二个搜索模式:
awk '/^[[:alpha:]]/ {printf [=12=] ; getline ; print}' trail
对于以字符开头的每一行,使用printf输出整行没有回车return,继续阅读line, print 整行 with 一个马车 return 在末尾。