awk
1.是liunx 下的文本处理工具,命名也是以三位作者的首字母命名。
语法:
awk [选项] ‘[条件]{编辑指令}’ 文件
[root@chenglj ~]# cat sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
# -F 使用空格分隔符拆分,打印出第一列 $1-第一列,$2-第二列 $NF 最后一列
[root@chenglj ~]# awk -F " " '{print $1}' sql
insert
insert
insert
insert
insert
insert
[root@chenglj ~]# awk '{print $1}' sql
insert
insert
insert
insert
insert
insert
[root@chenglj ~]# awk -F " " '{print $NF}' sql
values('6','shell-mysql','10','男',NULL,NULL);
values('7','扎根','13','女',NULL,NULL);
values('8','巴丹','29','女','扎根','7');
values('9','丹嘎','9','女','扎根','7');
values('10','图铭','92','男','张名','5');
values('11','天天','28','女','小丽',NULL);
[root@chenglj ~]# awk '{print $NF}' sql | awk -F "'" '{print $2}'
6
7
8
9
10
11
[root@chenglj ~]# awk '{print "第"NR"行","有"NF"列"}' sql
第1行 有10列
第2行 有10列
第3行 有10列
第4行 有10列
第5行 有10列
第6行 有10列
-- 输出id>7的数据
[root@chenglj ~]# awk -F "values" '{print $NF}' sql | awk -F "'" '$2>7{print $2,$4}'
8 巴丹
9 丹嘎
10 图铭
11 天天
-- 输出姓名中含有“巴”的用户
[root@chenglj ~]# awk -F "values" '{print $NF}' sql | awk -F "'" '$4~/丹/{print $0}'
('8','巴丹','29','女','扎根','7');
('9','丹嘎','9','女','扎根','7');
-- 输出姓名中不含有“巴”的用户
[root@chenglj ~]# awk -F "values" '{print $NF}' sql | awk -F "'" '$4!~/丹/{print}'
('6','shell-mysql','10','男',NULL,NULL);
('7','扎根','13','女',NULL,NULL);
('10','图铭','92','男','张名','5');
('11','天天','28','女','小丽',NULL);
-- 输出年龄大于20且性别是女的用户
[root@chenglj ~]# awk -F "values" '{print $NF}' sql | awk -F "'" '$6>20&&$8="女"{print}'
( 8 , 巴丹 , 29 , 女 , 扎根 , 7 );
( 10 , 图铭 , 92 , 女 , 张名 , 5 );
( 11 , 天天 , 28 , 女 , 小丽 ,NULL);
-- 输出姓名长度大于2的用户
[root@chenglj ~]# awk -F "values" '{print $NF}' sql | awk -F "'" 'length($4)>2{print $4,length($4)}'
shell-mysql 11
-- 输出奇数行数据
[root@chenglj ~]# awk 'NR%2==1{print $0,NR}' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL); 1
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7'); 3
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5'); 5
-- 统计以空格隔开的所有列数和
[root@chenglj ~]# awk 'BEGIN{i=0}{i+=NF}END{print i}' sql
60
--统计id>8的总行数
[root@chenglj ~]# awk -F "'" 'BEGIN{i=0}{if($2>8){i++}} END{print i}' sql
3
选项/内置变量 | 例子 |
---|---|
$0 | 整行可以省略’{print}’ |
$1 | 第一列 |
NF | 当前分割的总列数 |
NR | 当前已读的行数 |
FNR | 原文本的行数 |
print $NF | 最后一列 |
print $(NF-1) | 倒数第二列 |
-F | 指定分隔符,-F省略时 默认以空格或tab键分割 |
例子:
输出本机IP
ifconfig | grep 'inet' | head -n1 | awk '{print $2}'
192.168.1.13
运算符的使用
echo "1 3 5 7 9" | awk '{print $1+10}'
11
取最后一列
echo "1 3 5 7 9" | awk '{print $NF}'
9
取倒数第二列
echo "1 3 5 7 9 11 13" | awk '{print $(NF-1)}'
11
取倒数第二列+100
echo "1 3 5 7 9 11 13" | awk '{print $(NF-1)+100}'
111
取中间一列
echo "1 3 5 7 9 11 13" | awk '{print $(NF/2)}'
5 # 7/2=3.5=3
逻辑符号
例子:
取出如下数据中年龄小于20的用户
cat user.txt
d name age sex
1 张三 3 女
2 小名 12 男
3 豆豆 4 女
4 -mysql 20 未知
1 张三女/no exists no
2 小名 12 男
3 豆豆 4 女
5 张名 100 未知
2 小名 12 男
3 豆豆 4 女
4 -mysql 20 未知
3 豆豆 4 女
4 -mysql 20 未知
5 张名 100 未知
awk -F ' ' '$3 < 20 {print $1 " "$NF}' user.txt
1 女
2 男
3 女
2 男
3 女
2 男
3 女
3 女
打印年龄小于20且姓名是女的用户
awk -F ' ' '$3 < 20 && $NF == "女" {print $1 " "$NF}' user.txt
1 女
3 女
3 女
3 女
3 女
--输出 除了insert 之外的所有列 即第二列至第NF列 采用sed 更简单,直接替换insert即可
grep 'insert' sql | awk '{for(i=2;i<=NF;i++){printf $i " " } print '\n'}'
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
与上述效果相同
grep 'insert' sql | sed 's/insert//'
实战例子
统计当前系统的内存使用率
free | grep Mem | awk '{print $3/$2*100 "%"}'
shell脚本
#/bin/bash
# 统计当前系统的内存使用率的脚本
USE_MEM_RATIO=`free | grep Mem | awk '{print $3/$2*100 "%"}'`
echo -e "使用率:\e[31m$USE_MEM_RATIO\e[0m"
SED
强大的文本编辑器
语法:send [选项] ‘编辑指令’ 文件
编辑指令 | 说明 |
---|---|
p | 输出 print |
d | 删除 delete,默认不删除原文件,删除原文件需要加上-i |
s | 替换,默认不替换原文件,替换原文件需要加上-i |
行前行后操作 | 说明 | 例子 |
---|---|---|
i | 行前操作 | 在第一行添加sed ‘1i-- 这是用户表的sql语句’ sql |
a | 行后操作 | 插入多行时以\n分行,sed ‘1a/** 这是用户表的sql语句\n这是多行\n **/’ sql |
c | 替换整行 |
[root@chenglj ~]# cat -n sql
1 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
2 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
3 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
4 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
5 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
6 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 输出第【3-5】行数据
[root@chenglj ~]# cat -n sql | sed -n '3,5p'
3 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
4 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
5 insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
-- 删除包含‘巴’德行 (不会删除原文件,需要修改原文件需要加上-i)
sed '/巴/d' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 替换每一行中“女”未"FAMALE"
[root@chenglj ~]# sed 's/女/FAMALE/' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','FAMALE',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','FAMALE','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','FAMALE','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','FAMALE','小丽',NULL);
--将第4行中的第二个‘9’ 替换成'九'
[root@chenglj ~]# sed '4s/9/九/2' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','九','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 将第2-4行中的sql 注释掉(行首添加--)
[root@chenglj ~]# sed '2,4s/^/-- /' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
-- insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
-- insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
-- insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 还原2-4行的注释(首字符-- 替换成空)
[root@chenglj ~]# sed '2,4s/^--//' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 将包含‘女’的行的所有[0-3]的字符替换成“数字”
[root@chenglj ~]# sed '/女/s/[0-3]/数字/g' sql
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','数字数字','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','数字9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('数字数字','天天','数字8','女','小丽',NULL);
-- 在第1行前插入 语句
[root@chenglj ~]# sed '1i-- 这是用户表的sql语句' sql
-- 这是用户表的sql语句
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('6','shell-mysql','10','男',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
[root@chenglj ~]# sed '1c/** 这是用户表的sql语句\n这是多行\n **/' sql
/** 这是用户表的sql语句
这是多行
**/
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('7','扎根','13','女',NULL,NULL);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('8','巴丹','29','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('9','丹嘎','9','女','扎根','7');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('10','图铭','92','男','张名','5');
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`) values('11','天天','28','女','小丽',NULL);
-- 为sql语句新增一个字段,新增一个值
sed 's/_id`/&,`state`/' sql2 | rev | sed 's/LLUN/0,&/' | rev
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`,`state`) values('6','shell-mysql','10','男',NULL,NULL,0);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`,`state`) values('7','扎根','13','女',NULL,NULL,0);
insert into `user` (`id`, `name`, `age`, `sex`, `parent_name`, `parent_id`,`state`) values('11','天天','28','女','小丽',NULL,0);