文件输出操作 - 最好在同一行
道歉提前,这是我的第一篇文章,希望你能理解等文件输出操作 - 最好在同一行
原始文件
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做这一切,但不能得到它试图删除回车时工作。与:label
和N
文件
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
注意:假设所有输入由将一对的第二行被附加到在该对第一行的末尾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'
尝试:
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
不幸的是,并不是所有的行都以proc开头,我的错是因为没有足够的细节订阅。每行的开始可以是50多个不同的字符串。新文件样本添加到原始文章。请你再看一下。 – Neil
考虑到每一行在最后都会有Global,第二行在开始时会有空格,所以我现在在EDIT1部分修改了我的代码。如果你有更多的条件,那么请让我们知道。 – RavinderSingh13
'删除回车和单词Global'将该代码添加到问题..它将增加你已经做出的努力来解决.. – Sundeep