Linux中命令awk、sed,cut/sort/uniq

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	张三	32	小名	123	豆豆	44	-mysql	20	未知
1	张三女/no exists no
2	小名	123	豆豆	45	张名	100	未知
2	小名	123	豆豆	44	-mysql	20	未知
3	豆豆	44	-mysql	20	未知
5	张名	100	未知


awk -F ' ' '$3 < 20 {print $1 " "$NF}' user.txt
12323233 女

打印年龄小于20且姓名是女的用户
awk -F ' ' '$3 < 20 && $NF == "女" {print $1 " "$NF}' user.txt  
13333 女

--输出 除了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);







猜你喜欢

转载自blog.csdn.net/weixin_48470176/article/details/120479928