Linux之文本处理

这里介绍3种方式:

==>awk  
==>grep  
==>sed

awk处理文本(最常用):

  • 作用:awk对数据以行分析并生成报告时显得很强大,它将行进行切片,再处理分开的切片,可对格式化的数据重新进行格式化
  • awk命令格式:awk [F filed-separator] 'commands' input-fiel(s)
  • 参数-F:可以添加任意的分割符,比较重要
    awk工作流程是这样的:
  • 读入有'\n'换行符分割的一条记录,然后将记录按-F指定的域分隔符划分域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"。

1. 入门示例:

[wyb@localhost temp]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[wyb@localhost temp]$ head -n 5 /etc/passwd | awk -F ':' '{print $1}'  //输出第1列,域分隔符为:
root
bin
daemon
adm
lp
[wyb@localhost temp]$ head -n 5 /etc/passwd | awk -F ':'  '{pri
nt "id:"$1"\tshell:"$7}'    //输出第1、7列且给予列名
id:root shell:/bin/bash
id:bin  shell:/sbin/nologin
id:daemon       shell:/sbin/nologin
id:adm  shell:/sbin/nologin
id:lp   shell:/sbin/nologin
[wyb@localhost temp]$ head -n 5 /etc/passwd | awk -F ':'  'BEGIN {print "====begin====="} {print "id:"$1"\tshell:"$7} END {print "====end===="}'
====begin=====
id:root shell:/bin/bash
id:bin  shell:/sbin/nologin
id:daemon       shell:/sbin/nologin
id:adm  shell:/sbin/nologin
id:lp   shell:/sbin/nologin
====end====
[wyb@localhost temp]$ awk -F: '/root/' /etc/passwd  //搜索含有root关键字的所有行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[wyb@localhost temp]$ awk -F: '/root/{print $7}' /etc/passwd    //匹配root并输出对应shell
/bin/bash
/sbin/nologin
[wyb@localhost temp]$ awk -F: '/^root/' /etc/passwd //匹配以root开头的行
root:x:0:0:root:/root:/bin/bash

2. 内置变量:

ARGC       命令行参数个数
ARGV       命令行参数排列
ENVIRON    支持队列中系统环境变量的使用
FILENAME   awk浏览的文件名
FNR        浏览文件的记录数
FS         设置输入域分隔符,等价于命令行 -F选项
NF         浏览记录的域的个数
NR         已读的记录数
OFS        输出域分隔符
ORS        输出记录分隔符
RS         控制记录分隔符
[wyb@localhost temp]$ awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' a.txt
filename:a.txt,linenumber:1,columns:1,linecontent:1     root    12sf34s56
filename:a.txt,linenumber:2,columns:1,linecontent:2     admin   ksdjfiweurf
filename:a.txt,linenumber:3,columns:1,linecontent:3     dome    skd89453
filename:a.txt,linenumber:4,columns:1,linecontent:4     tomkd   3jkke34
filename:a.txt,linenumber:5,columns:1,linecontent:5     jarry   sdkj89ry4
filename:a.txt,linenumber:6,columns:1,linecontent:6     canki   sdkj834
filename:a.txt,linenumber:7,columns:1,linecontent:7     lola    er8f7734
filename:a.txt,linenumber:8,columns:1,linecontent:8     marry   j8jkf78
filename:a.txt,linenumber:9,columns:1,linecontent:9     candy   kd89943

3. awk编程:

3.1 变量和赋值:
[wyb@localhost temp]$ head -n 5 /etc/passwd | awk -F ':'  'BEGIN {count=0} {count++; print "username:"$1} END {print "count:"count}'
username:root
username:bin
username:daemon
username:adm
username:lp
count:5
[wyb@localhost ~]$ ls -l aaa/ettercap-0.8.2 | awk 'BEGIN {size=0;} {size=size+5;} END {print "[end]size is:",size,"byte"}'
[end]size is: 160 byte
[wyb@localhost ~]$ ls -l aaa/ettercap-0.8.2 | awk 'BEGIN {size=0;} {size=size+5;} END {print "[end]size is:",size/1024/1024,"M"}'
[end]size is: 0.000152588 M
[wyb@localhost ~]$ 
3.2条件语句:
[wyb@localhost ~]$ head -n 6 /etc/passwd | awk -F ':' '{if($1=="root") print "root bash is:"$7}'
root bash is:/bin/bash
[wyb@localhost ~]$ 

Grep处理文本:

匹配到时输出一行
常用参数:nrABC

-n           输出匹配到的字符串所在行数
-r           遍历子目录文件查找字符串
-A 3         显示匹配行及下面3行
-B 4         显示匹配行及上面4行
-C 4         显示匹配行及上下4行
-i           不区分大小写
-v           显示所有不包含字符的行
[wyb@localhost ~]$ grep root /etc/passwd    //查找root这个字符
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[wyb@localhost ~]$ grep -n root /etc/passwd //查找root字符串并输出所在行数
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[wyb@localhost ~]$ grep -n root /etc/passwd --color //给字符串不同颜色
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[wyb@localhost temp]$ ls
aa  b.txt
[wyb@localhost temp]$ grep -r -n root /home/wyb/temp/ --color   在temp目录及子目录查找字符串root
/home/wyb/temp/b.txt:4:sdkrootwe
/home/wyb/temp/b.txt:6:fsdkfjroot
/home/wyb/temp/b.txt:9:root
/home/wyb/temp/aa/a.txt:1:1     root    12sf34s56
[wyb@localhost temp]$ grep -r -n "^root" /etc/passwd --color    正则查找字符串root
1:root:x:0:0:root:/root:/bin/bash
[wyb@localhost temp]$ grep -r -n "root" /etc/passwd --color -c  匹配的行的数
2
[wyb@localhost temp]$ ps aux | grep "^wyb"
wyb        2185  0.0  0.1  99952  1840 ?        S    16:33   0:02 sshd: wyb@pts/0  
wyb        2186  0.0  0.1 108464  1944 pts/0    Ss   16:33   0:00 -bash
wyb        3229  2.0  0.1 110232  1136 pts/0    R+   18:27   0:00 ps aux
wyb        3230  0.0  0.0 103244   828 pts/0    S+   18:27   0:00 grep ^wyb
[wyb@localhost temp]$ ps aux | grep ora
wyb        3233  0.0  0.0 103244   828 pts/0    S+   18:28   0:00 grep ora
[wyb@localhost temp]$ 

sed处理文本

  • 处理大文本很好用,上几十万、上百万行的数据
  • sed主要以行为单位,可以将数据行进行替换、删除、新增、选取等
  • sed语法 参数 动作 文件
  • -n只把匹配到的输出
  • 主要参数是:
    • a 在下面插入数据
    • d 删除
    • i 在上面插入数据
    • p 输出数据
    • c 替换字符串,后面可跟字符串,字符串替换n1到n2之间的行

      s 替换字符串,通常搭配正则
  1. 字符的删除
    [wyb@localhost aa]$ nl a.txt | sed '3,8d'   //不输出3-8行
         1  1     root      12sf34s56
         2  2     admin     ksdjfiweurf
         9  9     candy     kd89943
    [wyb@localhost aa]$ nl a.txt | sed '3,$d'   //从第三行删到最后一行
         1  1     root      12sf34s56
         2  2     admin     ksdjfiweurf
    [wyb@localhost aa]$ nl a.txt | sed '/root/d'    //正则删除带root的行
         2  2     admin     ksdjfiweurf
         3  3     dome      skd89453
         4  4     tomkd     3jkke34
         5  5     jarry     sdkj89ry4
         6  6     canki     sdkj834
         7  7     lola      er8f7734
         8  8     marry     j8jkf78
         9  9     candy     kd89943
  1. a插入字符
    [wyb@localhost aa]$ nl a.txt | sed '2a aaaaaa' | head -n 5  //在第二行下面插入一行字符串aaaaaa
         1  1     root      12sf34s56
         2  2     admin     ksdjfiweurf
    aaaaaa
         3  3     dome      skd89453
         4  4     tomkd     3jkke34
    [wyb@localhost aa]$ nl a.txt | sed '2i aaaaaa' | head -n 5  //在第二行上面插入一行字符串aaaaaa
         1  1     root      12sf34s56
    aaaaaa
         2  2     admin     ksdjfiweurf
         3  3     dome      skd89453
         4  4     tomkd     3jkke34
    [wyb@localhost aa]$ nl a.txt | sed '2i aaaaaa \     //增加多行用\
    bbbbb\
    ccccc\
    dddddd' | head -n 7
         1  1     root      12sf34s56
    aaaaaa 
    bbbbb
    ccccc
    dddddd
         2  2     admin     ksdjfiweurf
         3  3     dome      skd89453
  1. p输出字符
    [wyb@localhost aa]$ nl a.txt | sed '2,5p'
         1  1     root      12sf34s56
         2  2     admin     ksdjfiweurf
         2  2     admin     ksdjfiweurf
         3  3     dome      skd89453
         3  3     dome      skd89453
         4  4     tomkd     3jkke34
         4  4     tomkd     3jkke34
         5  5     jarry     sdkj89ry4
         5  5     jarry     sdkj89ry4
         6  6     canki     sdkj834
         7  7     lola      er8f7734
         8  8     marry     j8jkf78
         9  9     candy     kd89943
    [wyb@localhost aa]$ nl a.txt | sed -n '2,5p'    //加-n去除其余行
         2  2     admin     ksdjfiweurf
         3  3     dome      skd89453
         4  4     tomkd     3jkke34
         5  5     jarry     sdkj89ry4
    [wyb@localhost aa]$ nl a.txt | sed -n '/root/p' //正则匹配root
         1  1     root      12sf34s56
    [wyb@localhost bbb]$ nl /etc/passwd | sed -n '/root/{s/root/111111/;p}'查找root,然后将行中的第一个root替换为abcdefg  -n代表不输出所有的
         1  111111:x:0:0:root:/root:/bin/bash
        11  operator:x:11:0:operator:/111111:/sbin/nologin
  1. c和s替换字符
    [wyb@localhost aa]$ nl a.txt | sed '2,5c aaaaaa'    //将第2-5行替换
         1  1     root      12sf34s56
    aaaaaa
         6  6     canki     sdkj834
         7  7     lola      er8f7734
         8  8     marry     j8jkf78
         9  9     candy     kd89943
    [wyb@localhost aa]$ nl /etc/passwd | sed -n '/root/{s/root/1111/g;p}'查找root,然后将全局的root替换为1111
         1  1111:x:0:0:1111:/1111:/bin/bash
        11  operator:x:11:0:operator:/1111:/sbin/nologin
    [wyb@localhost aa]$ nl /etc/passwd | sed -n '1,3{s/root/1111/g;p}'前五行查找root,然后将全局的root替换为1111
         1  1111:x:0:0:1111:/1111:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
         3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
    [wyb@localhost aa]$ nl /etc/passwd | sed -n '1,5{s/root/1111/g;p;q}'前五行查找root,然后将整行的root替换为1111,查找到一个就退出
         1  1111:x:0:0:1111:/1111:/bin/bash
  1. 实例
    [wyb@localhost aa]$ ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:56:B4:10  
              inet addr:192.168.63.131  Bcast:192.168.63.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe56:b410/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:11732 errors:0 dropped:0 overruns:0 frame:0
              TX packets:7223 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:1148256 (1.0 MiB)  TX bytes:1192150 (1.1 MiB)
    [wyb@localhost aa]$ ifconfig eth0 | grep 'inet add' 
              inet addr:192.168.63.131  Bcast:192.168.63.255  Mask:255.255.255.0
    [wyb@localhost aa]$ ifconfig eth0 | grep 'inet add' | sed 's/Bcast.*$//g'
              inet addr:192.168.63.131  
    [wyb@localhost aa]$ 
    
    [wyb@localhost aa]$ nl /etc/passwd | sed '3,$d'
         1  root:x:0:0:root:/root:/bin/bash
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    [wyb@localhost aa]$ nl /etc/passwd | sed '3,$d' | sed -n 's/bash/buleshell/p'
         1  root:x:0:0:root:/root:/bin/buleshell
    
    [wyb@localhost aa]$ nl /etc/passwd | sed -e '3,$d' -e 's/bash/buleshell/p'
         1  root:x:0:0:root:/root:/bin/buleshell
         1  root:x:0:0:root:/root:/bin/buleshell
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    [wyb@localhost aa]$ 
    
    
    [wyb@localhost aa]$ nl /etc/passwd | sed -e '3,$d' -e 's/bash/buleshell/p'
         1  root:x:0:0:root:/root:/bin/buleshell
         1  root:x:0:0:root:/root:/bin/buleshell
         2  bin:x:1:1:bin:/bin:/sbin/nologin
    [wyb@localhost aa]$ nl /etc/passwd | sed -e '3,$d' -e 's/bash/buleshell/p' > test.txt
    [wyb@localhost aa]$ cat test.txt 
         1  root:x:0:0:root:/root:/bin/buleshell
         1  root:x:0:0:root:/root:/bin/buleshell
         2  bin:x:1:1:bin:/bin:/sbin/nologin  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容