grep和awk
grep偏向于行处理
awk偏向于列处理,会把一行分成多个列
awk语言
awk同时也是一门编程语言,也有变量、数组、判断、循环等语法,awk内置了很多实用函数
要讲解的awk的内容:列处理、列过滤
示例文本文件/tmp/jackin
jackin1 28 hangzhou
jackin2 30 shenzhen
jackin3 32 shanghai
zhangsan1 33 hangzhou
zhangsan2 34 foreign
zhangsan3 18 beijing
awk简单使用,默认会使用空白字符隔成一列一列的
cat /tmp/jackin |awk '{print $1}' #打印姓名
cat /tmp/jackin |awk '{print $3}' #打印城市
awk内置变量
$0 整行
$1 第一列
$2 第二列
$n 第n列
$NF 最后一列 cat /tmp/jackin |awk '{print $NF}'
NR 当前处理到第几行 cat /tmp/jackin |awk '{print NR}'
awk打印多列、字符串拼接
cat /tmp/jackin |awk '{print $1,$2}' #打印多列,默认中间加空格
cat /tmp/jackin |awk '{print "name is "$1", ""age is "$2"."}' #拼接
awk针对列过滤,整数比较
number1 > number2
number1 < number2
number1 == number2
number1 >= number2
number1 <= number2
cat /tmp/jackin |awk '$2 > 30'
cat /tmp/jackin |awk '$2 == 30'
awk针对列过滤,字符串比较
cat /tmp/jackin |awk '$3 == "hangzhou"' #字符串对比
cat /tmp/jackin |awk '$3 != "hangzhou"'
awk针对列过滤,使用正则
cat /tmp/jackin |awk '$3 ~ /sh/' #字符串正则
cat /tmp/jackin |awk '$3 ~ /(sh)|(hang)/' #支持扩展正则
awk默认
如果没有过滤的化,会全部行数处理
如果没有动作的话,就会打印整行{print $0}
awk过滤加处理
cat /tmp/jackin |awk '$2>30{print $1}'