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