Linux有三剑客命令:grep/sed/awk
三剑客各自特长:
grep #过滤内容
sed #取行
awk #取列---取行--过滤
awk介绍
awk是Linux里命令里处于【扫地僧】的地位
awk是一门语言,也是一个命令。
awk功能
常用功能是【取列】,也可以【取行】和【过滤】。
awk语法
awk '{print $1}' 文件
awk -F ":" '{print $1}' 文件
注意写法:一对单引号里加一对大括号,里面加print $1,结尾加操作的文件
说明:
1)取的内容是每一行固定列或整行
2)不同列的内容默认分隔符是[空格]。
3)$1是第一列,$2是第二列, $0是整行
4)-F指定分隔符,":"是具体的分隔符,使用双引号引起来。
示例 去第一列:
[root@madou ~]# cat old.ttx
oldboy oldb
oldboy oldb
oldboy oldb
oldboy oldb
[root@madou ~]# awk '{print $1}' old.ttx
oldboy
oldboy
oldboy
oldboy
取整行 :
[root@madou ~]# awk '{print $0}' old.ttx
oldboy oldb
oldboy oldb
oldboy oldb
oldboy oldb
.指定分隔符过滤(-F)
指定分隔符过滤基本语法 示例:[root@madou ~]# awk -F : '{print $1}' /etc/passwd
1)取/etc/passwd的第1列
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
指定分隔符同时输出多列语法:[root@madou ~]# awk -F : '{print $1,$2}' /etc/passwd
从ip a或ifconfig结果中取出Ip地址(综合)
方法1:[root@madou ~]# ip a |grep '10.0.0'|awk '{print $2}'|awk -F/ {'print $1'}
10.0.0.100
使用多分隔符过滤
语法1:
awk -F "[/@ #]" '{print $1,$2}' 文件
语法2:多个挨着的分隔符算一个分隔符
awk -F "[/@ #]+" '{print $1,$2}' 文件
取行(干废sed)
语法:功能 NR
取第2行:awk NR==2 oldboy.txt
取第2-4行:awk NR==2,NR==4 oldboy.txt
取第2-4行:awk 'NR>1&&NR<5' oldboy.txt
取第2-4行:awk 'NR>=2&&NR<=4' oldboy.txt
awk过滤(干废grep)
问题:过滤/etc/passwd中包含oldboy字符串的行,并把登录解释器打印出来。
awk '/过滤的内容/' /etc/passwd
示例:awk '/oldboy/' /etc/passwd
oldboy:x:8893:8893::/home/oldboy:/bin/bash
语法:awk '/过滤的内容/{print $1}' /etc/passwd
过滤的同时,还可以取列
awk -F ":" '/oldboy/{print $NF}' /etc/passwd
小总结:awk知识总结:
0)基本语法:awk '{print $1}' 文件
1)分隔符,默认是空格,可用-F "分隔符"
语法:awk -F "分隔符" '{print $1}' 文件
2)取列
输出内容用print
不同列用下面符号
$1是第一列
$2是第二列
$NF是最后一列
$(NF-1)是倒数第二列
$0 取整行
NR行号
不同列分割用逗号分割,本质是空格。输出其它内容放在双引号里输出。
3)多分隔符:/@#=任意一个字符都可以做分隔符
语法1:awk -F "[/@#=]" '{print $1}' 文件
语法2:awk -F "[/@#=]+" '{print $1}' 文件 ##多个连续的分隔符算一个。
技巧:如何选取分隔符?选择要输出目标两边最近的字符作为分隔符。内容里不要包含分隔符。
4)过滤
语法1:awk '/过滤的内容/' 文件
语法2:awk '/过滤的内容/{print $1}' 文件
语法3:awk '/$1~过滤的内容/{print $1}' 文件 ##第一列匹配指定内容
语法4:awk '/$1=="过滤的内容"/{print $1}' 文件 ##第一列等于指定内容
语法5:awk '/$3>100{print $1}' 文件 ##第3列内容大于指定内容,内容为数字。
5)取行
语法1:awk 'NR==1,NR==4' 文件
语法2:awk 'NR>0&&NR<5' 文件
语法3:awk 'NR==4' 文件 #取第四行