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

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);

less

less命令用来搜索查看大文本数据,如日志文件等等。

显示行号

less -N my.log

less -N +300 my.log # 直接跳转到300行

less -N +80p my.log # 定位到文件的80%处

搜索时忽略大小写

less -i my.log 
== 按住/ 输入,向下搜索
== 按住? 输入,向上搜索 

显示前或后多少行(head)

cat  -n my.log | head -n +300  #显示前300行并显示行号
(等同于 cat -n my.log | head -300)

cat  -n my.log | head -n -300  #显示后300行并显示行号

显示指定的行(sed)

sed  -n 100,150p my.log # 显示100到150行

cat -n my.log | sed -n 100,3000p my.log | less # 显示100到第3000行,并结合less命令

查看指定行之后的所有信息

下面展示一些 内联代码片

tail  -n +2000 file    #查看2000行之后所有信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值