linux - 文本处理 及 正则表达式

先新建一个文件,并写入一些东西,方便测试, 从passwd里复制几行吧

$ head -n 10 /etc/passwd > passwd
t$ ll
总用量 12
drwxrwxr-x  2 huanghao huanghao 4096  3月  3 11:55 ./
drwxr-xr-x 19 huanghao huanghao 4096  3月  1 14:04 ../
-rw-rw-r--  1 huanghao huanghao  424  3月  3 11:55 passwd
$ cat passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

首先熟悉几个命令:

cat  查看文件所有内容,一次性打印所有内容

less 查看文件所有内容,但是可以pageup , pagedown上下翻页,q退出

more  查看文件所有内容,按空格一页一页翻,按回车一行一行翻, 但是只能往下翻

head   默认查看文件头10行,可以加-n参数定义行数

tail     默认查看文件末尾10行,可以加-n参数定义行数

 


cut 截断,

$ cut -d : -f 2 passwd     #以:分隔, 显示第2列
x
x
x
x
x
x
x
x
x
x
$ head -n 1 passwd | cut -c1-3    #显示passwd文件第一行的1-3个字符
roo

$ cut -c1-3 passwd           #显示所有行的1-3个字符
roo
dae
bin
sys
syn
gam
man
lp:
mai
new

sort 排序

$ cat passwd |sort                #默认按第一个字符排序
bin:x:2:2:bin:/bin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/usr/sbin/nologin
$ sort -t : -k 3 -n passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

-t     以…分隔

-k    是以哪一列来排序

-n    是以数字形式排序,比如11, 2,如果不加-n,可能11就排在2前面,因为第一个字符1比2小。

-r    反向排序

现在来年组合应用,排序后只显示第三列,直观感受排序

$ sort -t : -k 3 -n passwd |cut -d : -f3
0
1
2
3
4
5
6
7
8
9
$ sort -t : -k 4 -n passwd |cut -d : -f3-4
0:0
1:1
2:2
3:3
7:7
8:8
9:9
6:12
5:60
4:65534


grep

grep -A2 -B2 games /etc/passwd                 #上两行,下两行
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
huanghao@huanghao-Virtual-Machine:~/test$

wc  统计

$ cat passwd |wc
     10      10     424                       #行数,单词数,字符数

-l       显示行数

-w     显示单词数

-c      显示字符数

$ head -n 8 passwd |wc -l
8

uniq  去年相邻的重复行,只保留一个


正则表达式:

. 一个或多个任意字符
* 零个或多个前面的字符
a+ 一个或多个a
[] 括号中任何一个字符
[^] 非括号中任何一个字符
^ 以…开头
$ 以….结尾
\<s….k\> 以s开头,以k结尾,中间有四个字母的单词
\<s 以s开头的单词
a\{18\} a 重复18次
.\{40,\} 40个字母以上的单词
.\{40,50\} 40-50个字母的单词

来个组合应用一下:

$ grep '^i.\{14,\}n$' /usr/share/dict/words      #以i开头,n结尾,14个字母以上的单词
industrialization

再来一个:

$ grep -v '^#' /etc/colord.conf |grep -v '^$' |wc -l
6
这个是什么意思呢?配置文件里通常会有很多#号开头的注释行,还有很多空行,那这个命令的意思就是 统计所有不以#号开头而且不是空行的行数。’^$’一开始就结束 表示是空行。
posted @ 2016-03-03 15:08  黄小墨  阅读(1057)  评论(0编辑  收藏  举报