Linux三剑客总结

54 阅读6分钟

cut

截取一行中某一个区间的数据

语法结构

cut -d '分隔符' -f fields
cut -c 字符区间

案例一

[root@clay ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@clay ~]# echo $PATH|cut -d ':' -f 5
/root/bin


[root@clay ~]# md5sum 1.txt 
d41d8cd98f00b204e9800998ecf8427e  1.txt
[root@clay ~]# md5sum 1.txt |cut -c 1-5
d41d8

grep

处理某一行的数据

语法结构

grep [-acivnRE] --color '搜寻字符' filename
-a:将 binary 文件以 text 文件的方式搜寻数据
-c:计算找到 '搜寻字串' 的次数
-i:忽略大小写的不同,所以大小写视为相同
-v:反向输出
-n:输出行号
-R:递归查询
-E:扩展正则

案例二

不带参数,模糊过滤

[root@clay ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

反向输出

[root@clay ~]# grep -v 'root' /etc/passwd
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
sync:x:5:0:sync:/sbin:/bin/sync
...

显示行号

[root@clay ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

不考虑大小写

[root@clay ~]# grep -ni 'm' /etc/passwd
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

结合cut

[root@clay ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@clay ~]# grep -n 'root' /etc/passwd|cut -d ':' -f 2
root
operator

扩展正则:要使用到正则表达式 grep -E 相当于 egrep

递归查询:可以用来查找分别有哪个目录包含了要查询的内容

[root@clay ~]# grep -Rn 'yang' . 
./oldboy/2.txt:1:yang
./test/3.txt:1:yang
./old/1.txt:1:yang

sort uniqe wc

sort

可以用来排序

语法结构

sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写的差异
-b:忽略最前面空白的部分
-M:以月份的名字来排序
-n:以纯数字进行排序
-r:逆序
-t:分隔符,默认以[tab]为分隔符
-u:就是 uniq ,相同的数据中,仅出现一行代表
-K:指定某一列

案例一: 对用户信息表进行排序

[root@clay ~]# cat /etc/passwd|sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

案例二:以分隔符指定列排序

[root@clay ~]# cat /etc/passwd|sort -t ':' -k3
root:x:0:0:root:/root:/bin/bash
Yang:x:1000:1000::/home/Yang:/bin/bash
Jie:x:1001:1000::/home/Jie:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

看情况排序的效果并不正确,是因为数字以文字体态输出就是这样的想要以纯数字形式输出,就要加上-n参数

[root@clay ~]# cat /etc/passwd|sort -t ':' -k3 -n
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

uniqe

去重,将相同的展示一次

语法结构

uniq [-ic]
-i:忽略大小写
-c:对去重结果计数

案例一:登录用户

[root@clay ~]# last|cut -d ' ' -f1|sort|uniq -c
      1 
      7 reboot
     27 root
      1 wtmp

wc

统计行数,单词数,字符数

语法结构

wc [-lwm]
-l:统计行数
-w:统计单词数
-m:统计字符数

案例

[root@clay ~]# cat /etc/passwd|wc
     23      41    1043
You have new mail in /var/spool/mail/root
[root@clay ~]# cat /etc/passwd|wc -l
23
[root@clay ~]# cat /etc/passwd|wc -m
1043
[root@clay ~]# cat /etc/passwd|wc -w
41

tee

双向重导向,将内容输出到屏幕一份,到文件中一份

语法结构

tee [-a] file
-a:以追加(append)方式输入到文件中

案例

[root@clay ~]# cat /etc/passwd |tee 1.txt|cut -d ':' -f1
root
bin
daemon
adm
lp
...
[root@clay ~]# cat 1.txt 
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
...

字符转换命令:tr,col, join, paste, expand

tr

用来删除一段讯息当中的文字,或者是进行文字讯息的替换

语法结构

tr [-ds] set1
-d:删除set1这个字符串
-s:取代重复的字符串

案例一

[root@clay ~]# last|tr '[a-z]' '[A-Z]'
ROOT     PTS/0        10.0.0.1         SUN AUG  4 08:23   STILL LOGGED IN   
ROOT     PTS/0        10.0.0.1         SUN AUG  4 16:34 - 18:16  (-22:-17)  
REBOOT   SYSTEM BOOT  3.10.0-1160.EL7. SUN AUG  4 16:33 - 17:52  (01:18)    
ROOT     PTS/0        10.0.0.1         WED JUL 31 08:22 - CRASH (4+08:11)   

案例二

[root@clay ~]# cat /etc/passwd|tr -d ':'
rootx00root/root/bin/bash
binx11bin/bin/sbin/nologin
daemonx22daemon/sbin/sbin/nologin
admx34adm/var/adm/sbin/nologin
lpx47lp/var/spool/lpd/sbin/nologin
syncx50sync/sbin/bin/sync

正则表达式以及延伸正则

基础正则表达式

RE字符描述
^word以word为开头的行
word$以word为结尾的行
.表示一定有任意一个字符
*表示有0或者0个以上的字符
\表示转义字符
[list]表示列表内待搜寻的某个字符,每次只匹配其中某一个
[n1-n2]表示要截取的范围
[^list]表示对列表中的内容取反,也就是取除列表外的字符
{n,m}表示连续取出的内容的区间

延申正则表达式

RE描述
+表示重复前一个字符一次及一次以上
?表示前0个或者一个
|表示或者
()找出群组的字符串
()+表示多个群组的重复组合

sed

sed可以将数据进行取代、删除、新增、撷取特定行等等的功能

语法结构

sed [-nefr] [动作]
-n:沉静式输出
-e:直接在命令行界面上进行 sed 的动作编辑
-f:将sed的动作写到一个文件中,-f filename 可以执行filename中的sed动作
-r:扩展正则

动作说明:[n1[,n2]]function
a:新增,当前的下一行
c:取代,取代n1,n2之间的行
d:删除
i:插入:当前行的上一行
p:打印,有p就有n
s:取代,搭配正则使用

案例一:删除

[root@clay ~]# cat -n  /etc/passwd|sed '2,5d'
     1	root:x:0:0:root:/root:/bin/bash
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

案例二:追加

[root@clay ~]# cat -n  /etc/passwd|sed '2a yangjiechao'
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
yangjiechao
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin

案例三:插入

[root@clay ~]# cat -n  /etc/passwd|sed '2i yangjiechao'
     1	root:x:0:0:root:/root:/bin/bash
yangjiechao
     2	bin:x:1:1:bin:/bin:/sbin/nologin

案例四:取代

[root@clay ~]# cat -n  /etc/passwd|sed '2,5c yangjiechao'
     1	root:x:0:0:root:/root:/bin/bash
yangjiechao
     6	sync:x:5:0:sync:/sbin:/bin/sync

案例五:取指定行

[root@clay ~]# cat -n  /etc/passwd|sed -n '2,5p'
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

案例六:替换,将:替换成空格

[root@clay ~]# cat /etc/passwd|sed 's/:/ /g'
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

[root@clay ~]# cat /etc/passwd|sed 's#:# #g'
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

案例七:取IP地址

[root@clay ~]# ip a|grep "inet 10"|sed 's/^.*inet //g'
10.0.0.202/24 brd 10.0.0.255 scope global noprefixroute ens33
[root@clay ~]# ip a|grep "inet 10"|sed 's/^.*inet //g'|sed 's/ brd.*$//g'
10.0.0.202/24

案例八:取出man_db.conf的有效行

[root@clay ~]# cat /etc/man_db.conf|grep "MAN"|sed 's/^#.*$//g'|sed '/^$/d'
MANDATORY_MANPATH			/usr/man
MANDATORY_MANPATH			/usr/share/man
MANDATORY_MANPATH			/usr/local/share/man
MANPATH_MAP	/bin			/usr/share/man
...

案例九:直接修改文件内容

[root@clay ~]# sed -i 's/root/oldboy/g' passwd 
[root@clay ~]# cat passwd 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash

案例十:直接在文件最后加内容

[root@clay ~]# sed -i '$a I am Boss' passwd 
[root@clay ~]# cat passwd 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
....
I am Boss

案例十一:sed的模糊过滤

[root@clay ~]# sed -n '/Yang/p' passwd 
Yang:x:1000:1000::/home/Yang:/bin/bash

案例十二:sed的后向引用

[root@clay ~]# echo oldboy|sed -r 's#(oldboy)#\1#g'
oldboy
[root@clay ~]# echo oldboy|sed -r 's#(ol)d(boy)#\1#g'
ol
[root@clay ~]# echo oldboy|sed -r 's#(ol)d(boy)#\1,\2#g'
ol,boy

利用后向引用取出IP地址

[root@clay ~]# ip a|grep "inet 10"|sed -r 's#^.*inet (10.0.0.202/24) brd.*$#\1#g'
10.0.0.202/24

注意后向引用只能用s###g

awk

awk最常用的就是按列或者是行取数据

语法结构

awk '条件类型1{动作1},条件类型2{动作2},条件类型3{动作3}' filename

案例一

[root@clay ~]# last -n 5
root     pts/0        10.0.0.1         Mon Aug  5 16:16   still logged in   
root     pts/0        10.0.0.1         Sun Aug  4 08:23 - 18:10  (09:46)    
root     pts/0        10.0.0.1         Sun Aug  4 16:34 - 18:16  (-22:-17)  
reboot   system boot  3.10.0-1160.el7. Sun Aug  4 16:33 - 17:19 (1+00:45)   
root     pts/0        10.0.0.1         Wed Jul 31 08:22 - crash (4+08:11)

[root@clay ~]# last -n 5|awk '{print $1 "\t" $3}'
root	10.0.0.1
root	10.0.0.1
root	10.0.0.1
reboot	boot
root	10.0.0.1

awk内置变量

变量描述
NF代表列数
NR代表行数
FS代表分隔符,默认空白为分隔符

awk逻辑运算符

符号表述
大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

案例二

[root@clay ~]# cat -n  /etc/passwd|awk -F: 'NR>=2&&NR<=5{print $1 "\t" $3}'
     2	bin	1
     3	daemon	2
     4	adm	3
     5	lp	4

案例三:模糊过滤

[root@clay ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
You have new mail in /var/spool/mail/root