一、awk引子
awk是
Linux
里命令里处于【扫地僧】的地位
awk是一门语言,也是一个命令。
最擅长处理文本的语言或命令
Linux有三剑客命令:
grep/sed/awk
三剑客各自特长:
grep #过滤内容
sed #取行
awk #取列
---
取行
---
过滤一、
二、什么是awk?
awk是一门语言,通过处理复杂文本字符串,取到最终需要的内容。
C、
C++
开发人员,处理字符串几乎都会用
awk
。
命令行来说,掌握awk
命令基本使用
三、awk功能
常用功
能是【取列】,但是也可以【取行】和【过滤】。
awk '{print $1}' 文件 ##分隔符是空格
awk -F ":" '{print $1}' 文件 ##指定冒号为分隔符
注意写法:一对单引号里加一对大括号,里面加print $1
,结尾加操作的文件
说明:
1)取的内容是每一行固定列或整行
2)不同列的内容默认分隔符是
[
空格
]
。
3)
$1
是第一列,
$2
是第二列
,........ $NF
最后一列,倒数第二列
$(NF-1)
,
$0
是整行
4)
-F
指定分隔符,
":"
是具体的分隔符,使用双引号引起来
小试牛刀练习1
#准备
[root@oldboy ~]# cd ~
[root@oldboyedu ~]# echo "oldboy oldgirl" >>oldboy.txt
[root@oldboyedu ~]# echo "oldboy oldgirl" >>oldboy.txt
[root@oldboyedu ~]# cat oldboy.txt
oldboy oldgirl
oldboy oldgirl
#取第一列
[root@oldboy ~]# awk '{print $1}' oldboy.txt
oldboy
oldboy
#取第二列
[root@oldboy ~]# awk '{print $2}' oldboy.txt
oldgirl
oldgirl
#取整行
[root@oldboy ~]# awk '{print $0}' oldboy.txt
oldboy oldgirl
oldboy oldgirl
#取第1列和第二列
[root@oldboy ~]# awk '{print $1,$2}' oldboy.txt
oldboy oldgirl
oldboy oldgirl
指定分隔符过滤(-F)
1
、指定分隔符过滤基本语法
##
语法:
awk -F "
分隔符
" '{print $1}' /etc/passwd
1)取/etc/passwd的第1列
awk -F ":" '{print $1}' /etc/passwd
##简单写法
awk -F: '{print $1}' /etc/passwd
2)取/etc/passwd的第2列
awk -F ":" '{print $2}' /etc/passwd
3)取/etc/passwd的第整行
awk -F ":" '{print $0}' /etc/passwd
4)取/etc/passwd的尾列
awk -F ":" '{print $NF}' /etc/passwd
5)取/etc/passwd的倒数第2列
awk -F ":" '{print $(NF-1)}' /etc/passwd
指定分隔符同时输出多列语法:
awk -F "分隔符" '{print $1,$2}' 文件 ##逗号是空格。
1)取/etc/passwd的第1列和第2列
awk -F ":" '{print $1,$2}' /etc/passwd
2)取/etc/passwd的第1列、第3列和最后一列
awk -F ":" '{print $1,$3,$NF}' /etc/passwd
3)在输出的结果中加想要加的内容,这里加oldboy
awk -F: '{print $1,"oldboy",$2}' /etc/passwd
同时指定多分隔符
#语法:awk -F "[ /:=]" '{print $1,$2}' 文件
#遇到空格,斜线,冒号,等号都认为是分隔符。
#练习1:过滤ip a结果中的ip地址
##同时指定空格和斜线作为分隔符
[root@oldboy ~]# ip a|grep "/24"|awk -F "[ /]" '{print $6}'
10.0.0.128
#练习2:过滤stat /etc/hosts中的0644
[root@oldboy ~]# stat /etc/hosts|grep 0644|awk -F "[(/]" '{print $2}'
0644
多分隔符连续
#语法:awk -F "[ /:=]+" '{print $1,$2}' 文件
#遇到空格,斜线,冒号,等号都认为是分隔符。
#碰到连续的指定分隔符算一个分隔符。
#练习1:过滤ip a结果中的ip地址
##同时指定空格和斜线作为分隔符
[root@oldboy ~]# ip a|grep "/24"|awk -F "[ /]+" '{print $3}'
10.0.0.128
#练习2:把文件中的数字取出来
[root@oldboy ~]# echo ===1---2///3/@@@@4 >oldboy.txt
[root@oldboy ~]# cat oldboy.txt
===1---2///3/@@@@4
[root@oldboy ~]# awk -F '[=/@-]+' '{print $2,$3,$4,$5}' oldboy.txt
1 2 3 4