Linux里面的命令非常多,有一些命令是比较难以理解的,例如AWK SED等,今天就对大数据经常用到的这几个命令进行详细的了解。
AWK
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。他默认是按行进行处理的,我之前有写过一篇AWK的讲解,里面有充足的案例来理解,可以看看:Linux最难命令awk:详解解读
AWK的语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项的参数说明:
-F 后面接的是分隔符 例如 -F: 代表的是用:分割 -F, 代表的是用,分割
-v 后面接的是定义的变量 例如 -v a=1 定义好了变量a
案例讲解
编辑好文本文件, vim log.txt:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
用法1:awk ‘{[pattern] action}’ {filenames} # 行匹配语句 awk ” 只能用单引号
在默认的情况下,每行按空格或者TAB分割
输出文本内容的第1,4项:
[zhang@hadoop102 datas]$ awk '{print $1,$4}' log.txt
2 a
3 like
This's
10 orange,apple,mongo
格式化输出:
[zhang@hadoop102 datas]$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
2 a
3 like
This's
10 orange,apple,mongo
用法2:awk -F #-F相当于内置变量FS, 指定分割字符
我们编辑的好的文本内容是按照空格切割,如果我输入的是用:切割,输出的结果:
[zhang@hadoop102 datas]$ awk -F: '{print $1,$2}' log.txt
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
文本中没有:的话,默认就无法切割,全部输出。
接下来,按照空格输出,注意,-F后面的切割符号应该添加 ’ ’
[zhang@hadoop102 datas]$ awk -F ' ' '{print $1,$2}' log.txt
2 this
3 Are
This's a
10 There
用法3: -V设置变量
[zhang@hadoop102 datas]$ awk -v a=1 '{print $1,$1+a}' log.txt
2 3
3 4
This's 1
10 11
SED
Linux sed 命令是利用脚本来处理文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
基本语法
--version 显示sed版本
-e script 允许多个脚本指令被执行
-f script-file 从文件中读取脚本指令,对编写自动脚本程序很实用
案例讲解
数据准备:vim test.txt:
DEVICE=eno16777736
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=yes
查看文本的数据和对应行号:
[zhang@hadoop102 datas]$ cat -n test.txt
1 DEVICE=eno16777736
2 BOOTPROTO=static
3 IPADDR=192.168.0.1
4 NETMASK=255.255.255.0
5
6 GATEWAY=192.168.0.254
7
8 ONBOOT=yes
第二行后追加TYPE=Ethernet:
[zhang@hadoop102 datas]$ sed '2a TYPE=Ethernet' test.txt
DEVICE=eno16777736
BOOTPROTO=static
TYPE=Ethernet
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=yes
第三行前追加TYPE=Network:
[zhang@hadoop102 datas]$ sed '3i TYPE=Network' test.txt
DEVICE=eno16777736
BOOTPROTO=static
TYPE=Network
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=yes
将样本文件中的所有yes替换为no:
[zhang@hadoop102 datas]$ sed 's/yes/no/g' test.txt
DEVICE=eno16777736
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=no
上面是依据行号定位操作对象(地址),如2a即第二行后追加。实际工作中,可能大多数情况你并不确定你要操作对象(地址)的行号,这时更多的会使用正则表达式确定操作对象(地址)。下面是使用正则表达式定位操作行的示例:
匹配到包含ONBOOT的行,并在其后添加TYPE=Ethernet:
[zhang@hadoop102 datas]$ sed '/ONBOOT/a TYPE=Ethernet' test.txt
DEVICE=eno16777736
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=yes
TYPE=Ethernet
匹配GATEWAY开始的行,并删除该行:
[zhang@hadoop102 datas]$ sed '/^GATEWAY/d' test.txt
DEVICE=eno16777736
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
我们的操作指令可以写入到脚本文件中,并通过sed的-f选项读取,脚本文件中的注释行是以#开始的行,如果#后面的字符为n,则屏蔽Sed程序的自动输出功能,等同于命令选项-n。创建一个sed脚本,内容如下:
脚本内容为匹配到空白行后,删除该行
#!/bin/bash
/^$/d
[zhang@hadoop102 datas]$ cat sed.sh
#!/bin/bash
/^$/d
[zhang@hadoop102 datas]$ sed -f sed.sh test.txt
DEVICE=eno16777736
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
ONBOOT=yes
CUT
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的。
基本语法
cut [-bn] [file] 或
cut [-c] [file] 或
cut [-df] [file]
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
案例讲解
输入who命令
[zhang@hadoop102 datas]$ who
zhang pts/0 2021-10-24 10:17
zhang pts/1 2021-10-21 09:21
我们要截取每一行的第三个字节
[zhang@hadoop102 datas]$ who|cut -b 3
a
a
截取第3,第11,第12个字节:
[zhang@hadoop102 datas]$ who|cut -b 3,11,12
ats
ats
Sort
用于将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。
基本语法
-r :倒序排序
-n:按照number顺序排列
-k指定第几列或第几列的第几个字符。
案例讲解
数据准备,vim number.txt:
[zhang@hadoop102 datas]$ cat number.txt
45
82
99
28
35
15
76
65
8
29
4
109
-n的使用,是按照number的升序顺序排列,第一个字符相同的情况下,对下一个字符进行排列:
[zhang@hadoop102 datas]$ sort -n number.txt
4
8
15
28
29
35
45
65
76
82
99
109
-r: 逆序排列,从大到小:
[zhang@hadoop102 datas]$ sort -r number.txt
99
82
8
76
65
45
4
35
29
28
15
109
-k 按照指定的列 排列,通常和-t一起配合使用,-t后面接的是分隔符:
[zhang@hadoop102 datas]$ cat fruit.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
[zhang@hadoop102 datas]$ sort -k 2 -t : fruit.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3
一般-nrk可以结合在一起使用,结合在一起使用过的时候,-k是写在末尾,同时按照number倒序排列
[zhang@hadoop102 datas]$ sort -nrk 3 -t: fruit.txt
banana:30:5.5
orange:20:3.4
apple:10:2.5
pear:90:2.3