Linux Shell脚本工具实践

Cut

在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

用法

cut [选项参数] filename

说明:默认分隔符是制表符

参数说明

参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列

样例

1
2
3
4
5
6
[root@localhost ~]# vim cut.txt
dong shen
guan zhen
wo wo
lai lai
le le

切割cut.txt第一列

1
2
3
4
5
6
[root@localhost ~]# cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

切割cut.txt第二、三列

1
2
3
4
5
6
[root@localhost ~]# cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le

在cut.txt文件中切割出guan

1
2
[root@localhost ~]# cat cut.txt | grep "guan" | cut -d " " -f 1
guan

选取系统PATH变量值,第2个“:”开始后的所有路径

1
2
3
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin:/usr/
local/jdk1.8.0_111/bin:/usr/local/node/bin:/usr/local/maven3/bin:/root/bin
1
2
3
[root@localhost ~]# echo $PATH | cut -d: -f 2-
/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin:/usr/local/jdk1.8.0_1
11/bin:/usr/local/node/bin:/usr/local/maven3/bin:/root/bin

切割ifconfig 后打印的IP地址

1
2
[root@localhost ~]# ifconfig eth0 | grep "inet " | cut -d " " -f 10
192.168.25.131

Sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

用法

sed [选项参数] ‘command’ filename

参数说明

参数 功能
-e 直接在指令列模式上进行sed的动作编辑
a 新增,a的后面可以接字串,在下一行出现
d 删除
s 查找并替换

样例

1
2
3
4
5
6
7
8
[root@localhost ~]# vim sed.txt
dong shen
guan zhen
wo wo
lai lai

le le

将“meimei”这个单词插入到sed.txt第二行下,打印

1
2
3
4
5
6
7
8
[root@localhost ~]# sed '2a meimei' sed.txt
hen
guan zhen
meimei
wo wo
lai lai

le le

删除sed.txt文件所有包含wo的行

1
2
3
4
5
6
[root@localhost ~]# sed '/wo/d' sed.txt
hen
guan zhen
lai lai

le le

将sed.txt文件中wo替换为ni

1
2
3
4
5
6
7
[root@localhost ~]# sed 's/wo/ni/g' sed.txt
hen
guan zhen
ni ni
lai lai

le le

将sed.txt文件中的第二行删除并将ni替换为wo

1
2
3
4
5
6
[root@localhost ~]# sed -e '2d' -e 's/ni/wo/g' sed.txt
hen
wo wo
lai lai

le le

Awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

用法

awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

pattern:表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

参数说明

参数 功能
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)

样例

搜索passwd文件以root关键字开头的所有行,并输出该行的第7列

1
2
3
[root@localhost ~]# cp /etc/passwd ./
[root@localhost ~]# awk -F: '/^root/{print $7}' passwd
/bin/bash

搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割

1
2
[root@localhost ~]# awk -F: '/^root/{print $1","$7}' passwd
root,/bin/bash

找到使用CPU最高的进程之使用CPU最高的线程的16进制号

1
2
3
4
[root@JD ~]# ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 |  awk '{print $2}' 
|xargs top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xa
rgs printf 0x%x
0x60fd

只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加”dfdf,/bin/dfdf”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~]# awk -F : 'BEGIN{print "user,shell"}{print $1","$7}END{pri
nt "dfdf,/bin/dfdf"}' passwd
user,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
sync,/bin/sync
shutdown,/sbin/shutdown
halt,/sbin/halt
mail,/sbin/nologin
operator,/sbin/nologin
games,/sbin/nologin
ftp,/sbin/nologin
nobody,/sbin/nologin
systemd-bus-proxy,/sbin/nologin
systemd-network,/sbin/nologin
dbus,/sbin/nologin
polkitd,/sbin/nologin
rpc,/sbin/nologin
tss,/sbin/nologin
rpcuser,/sbin/nologin
nfsnobody,/sbin/nologin
sshd,/sbin/nologin
postfix,/sbin/nologin
chrony,/sbin/nologin
vagrant,/bin/bash
mysql,/bin/false
tomcat,/bin/bash
dockerroot,/sbin/nologin
dfdf,/bin/dfdf

将passwd文件中的用户id增加数值1并输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost ~]# awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4
5
6
7
8
9
12
13
15
100
1000
193
82
999
33
60
30
65535
75
90
998
1001
28
1002
997

统计passwd文件名,每行的行号,每行的列数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@localhost ~]# awk -F : '{print "filename:"FILENAME ",linenumber:" NR ",
columns:" NF}' passwd
filename:passwd,linenumber:1,columns:7
filename:passwd,linenumber:2,columns:7
filename:passwd,linenumber:3,columns:7
filename:passwd,linenumber:4,columns:7
filename:passwd,linenumber:5,columns:7
filename:passwd,linenumber:6,columns:7
filename:passwd,linenumber:7,columns:7
filename:passwd,linenumber:8,columns:7
filename:passwd,linenumber:9,columns:7
filename:passwd,linenumber:10,columns:7
filename:passwd,linenumber:11,columns:7
filename:passwd,linenumber:12,columns:7
filename:passwd,linenumber:13,columns:7
filename:passwd,linenumber:14,columns:7
filename:passwd,linenumber:15,columns:7
filename:passwd,linenumber:16,columns:7
filename:passwd,linenumber:17,columns:7
filename:passwd,linenumber:18,columns:7
filename:passwd,linenumber:19,columns:7
filename:passwd,linenumber:20,columns:7
filename:passwd,linenumber:21,columns:7
filename:passwd,linenumber:22,columns:7
filename:passwd,linenumber:23,columns:7
filename:passwd,linenumber:24,columns:7
filename:passwd,linenumber:25,columns:7
filename:passwd,linenumber:26,columns:7
filename:passwd,linenumber:27,columns:7
filename:passwd,linenumber:28,columns:7

查询sed.txt中空行所在的行号

1
2
3
[root@localhost ~]# awk '/^$/{print NR}' sed.txt
5
7

Sort

文件进行排序,并将排序结果标准输出

用法

sort(选项)(参数)

参数说明

参数 功能
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

样例

按照“:”分割后的第三列倒序排序

1
2
3
4
5
6
7
[root@localhost ~]# vim sort.sh
[root@localhost ~]# sort -t : -nrk 3 sort.sh
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6

对文本中无序的一列数字排序

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}'
1
2
3
4
5
6
7
8
9
10
SUM=55