Chinaunix
标题:
请教awk过滤行中空格或\t
[打印本页]
作者:
ccjsj1
时间:
2016-03-08 22:33
标题:
请教awk过滤行中空格或\t
本帖最后由 ccjsj1 于 2016-03-08 22:35 编辑
如下:将每3行按一行输出,做下对齐,但第6行和第9行是以空格或\t开头,用gsub过滤不掉--!
neo@asterisk:/tmp$ cat 3.log
STATUS
------------
OPEN
SESSION_ACTIVE
--------------
30
SESSION_CURCOUNT
----------------
463
PROCESSES_ALLCOUNT
------------------
10000
neo@asterisk:/tmp$ cat -A 3.log
STATUS$
------------$
OPEN$
SESSION_ACTIVE$
--------------$
^I30$
SESSION_CURCOUNT$
----------------$
^I463$
PROCESSES_ALLCOUNT$
------------------$
10000$
neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/\t/,""); printf("%-20s",$0); a++ } else {print $0; a=1}}'
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/^ */,""); printf("%-20s",$0); a++ } else {print $0; a=1}}'
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
neo@asterisk:/tmp$ cat 3.log | awk '{if($0~"STATUS") a=1; if(a!=3) {gsub(/^ */,""); printf("%-20s",$0); a++ } else {print $0; a=1}}' | cat -A
STATUS ------------ OPEN$
SESSION_ACTIVE -------------- ^I30$
SESSION_CURCOUNT ---------------- ^I463$
PROCESSES_ALLCOUNT ------------------ 10000$
复制代码
作者:
Herowinter
时间:
2016-03-08 23:18
回复
1#
ccjsj1
cat 3.log|xargs -n 3|column -t
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
复制代码
作者:
ccjsj1
时间:
2016-03-09 08:54
回复
2#
Herowinter
感谢这末快的回复!结果也是期望的
!还是想用awk来实现,不知有什末办法没有?谢谢!
作者:
jcdiy0601
时间:
2016-03-09 09:35
sed -e 's/^\s*//;N;N;s/\n/ /g' file |column -t
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
复制代码
作者:
zxy877298415
时间:
2016-03-09 09:43
awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' file
复制代码
回复
1#
ccjsj1
作者:
ccjsj1
时间:
2016-03-09 10:45
本帖最后由 ccjsj1 于 2016-03-09 10:45 编辑
回复
4#
jcdiy0601
谢谢回复!结果是想要的
!sed一直没学明白
想用awk实现
作者:
Herowinter
时间:
2016-03-09 10:45
回复
3#
ccjsj1
首先回答你的疑问, 空格 \t不是没有成功替换, 而是你没有让awk对$0重新进行赋值($1=$1).
比较下这两段代码的输出就知道了.
awk '{gsub(/^\s*/,"");print}' test
STATUS
------------
OPEN
SESSION_ACTIVE
--------------
30
SESSION_CURCOUNT
----------------
463
PROCESSES_ALLCOUNT
------------------
10000
awk '{gsub(/^\s*/,"");$1=$1;print}' test
STATUS
------------
OPEN
SESSION_ACTIVE
--------------
30
SESSION_CURCOUNT
----------------
463
PROCESSES_ALLCOUNT
------------------
10000
复制代码
用awk结合column -t也可以, 非要拿掉column -t自己去负责对齐吧.
awk '{s=s"\t"$1} NR%3==0{print s;s=""}' test|column -t
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
复制代码
作者:
elu_ligao
时间:
2016-03-09 10:46
回复
1#
ccjsj1
你那里有点问题, gsub放错地方了
awk '{if($0~"STATUS") a=1; if(a!=3) {printf("%-20s",$0); a++ } else {gsub(/\t/,"");print $0; a=1}}'
复制代码
作者:
ccjsj1
时间:
2016-03-09 11:33
回复
5#
zxy877298415
试了下还是不行啊
neo@asterisk:~/check_log/awk$ cat 3.log
STATUS
------------
OPEN
SESSION_ACTIVE
--------------
30
SESSION_CURCOUNT
----------------
463
PROCESSES_ALLCOUNT
------------------
10000
neo@asterisk:~/check_log/awk$ awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' 3.log
STATUS ------------ OPEN
SESSION_ACTIVE -------------- 30
SESSION_CURCOUNT ---------------- 463
PROCESSES_ALLCOUNT ------------------ 10000
neo@asterisk:~/check_log/awk$ awk '{if(NR%3==0) {print gensub(" ","","G",$0)} else {printf("%-20s",$0)}}' 3.log | cat -A
STATUS ------------ OPEN$
SESSION_ACTIVE -------------- ^I30$
SESSION_CURCOUNT ---------------- ^I463$
PROCESSES_ALLCOUNT ------------------ 10000$
neo@asterisk:~/check_log/awk$
复制代码
作者:
ccjsj1
时间:
2016-03-09 11:36
本帖最后由 ccjsj1 于 2016-03-09 11:47 编辑
回复
7#
Herowinter
你好,非常感谢!
不用重新赋值也是可以的(这是$0的内容已经修改了吧),如下:
neo@asterisk:~/check_log/awk$ awk '{gsub(/^\s*/,"");print $0}' 3.log
STATUS
------------
OPEN
SESSION_ACTIVE
--------------
30
SESSION_CURCOUNT
----------------
463
PROCESSES_ALLCOUNT
------------------
10000
neo@asterisk:~/ch
复制代码
作者:
ccjsj1
时间:
2016-03-09 11:51
回复
8#
elu_ligao
多谢了,这个可以的!
将下面内容放到第二个if前面也可以,每行都替换下;
gsub(/\t/,""
作者:
elu_ligao
时间:
2016-03-09 11:58
回复
11#
ccjsj1
嗯, 当然, 我看你的代码, 意思好像是3的倍数的行就gsub,else 里面才是3倍数所在行执行的操作
作者:
blackold
时间:
2016-03-09 12:01
回复
7#
Herowinter
有没有弄错呢?
作者:
blackold
时间:
2016-03-09 12:03
本帖最后由 blackold 于 2016-03-09 12:13 编辑
回复
9#
ccjsj1
不是不行,因为
" "
复制代码
空白地方,人家用的是<tab>,而你用的是<space>。 肯定不行了。
你用/\t/ 或 /\s/ 代替 " " 试试:
awk '{if(NR%3==0) {print gensub(/\t/,"","G",$0)} else {printf("%-20s",$0)}}' urfile
复制代码
awk '{if(NR%3==0) {print gensub(/\s/,"","G",$0)} else {printf("%-20s",$0)}}' urfile
复制代码
或者
awk 'NR%3{printf("%-20s",$0);next}{gsub(/\t/,"");}1' urfile
复制代码
作者:
blackold
时间:
2016-03-09 12:08
回复
8#
elu_ligao
赞!
作者:
ccjsj1
时间:
2016-03-09 12:37
回复
15#
blackold
明白了,多谢黑哥!
这末多方法,越来越简练!!
作者:
Herowinter
时间:
2016-03-09 13:17
回复
13#
blackold
是我搞错了, 没有替换成功.
作者:
jcdiy0601
时间:
2016-03-10 09:09
回复
6#
ccjsj1
我也是在学习,你的思路也很好
作者:
baby_神
时间:
2016-03-19 23:52
又学到一个新的函数用法,这个在书上好像没见过,不错
回复
5#
zxy877298415
作者:
ccjsj1
时间:
2016-03-21 12:43
回复
19#
时时20160307
不错,又学了一招,谢谢!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2