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