SHELL(05)

30 篇文章 0 订阅
6 篇文章 0 订阅

SHELL(04)

[ awk ]

  • awk 编程语言 / 数据处理引擎

    • 创造者的缩写是 : A,W,K

    • 基于模式匹配检查输入文本 , 逐行处理并输出

    • 通常用于Shell脚本中 , 获取指定的数据

    • 单独使用时 , 可对文本数据做统计

  • grep 简单易用 , 功能少只能查

  • sed 功能齐全 , 搜索精度低 # 逐行处理

  • awk 搜索精度高 , 可以简单的排版等 , 不能做到非交互式操作 #逐行处理

格式
  • awk [ 选项 ] ’ [ 条件 ] { 处理动作 } ’ 文件列表
  • 命令 | awk [ 选项 ] ’ [ 条件 ] { 处理动作 } ’
cat test.txt
1 2 3
4 5 6

awk '{print $1,$3}' test.txt
1 3
4 6
选项 [ -F ]
  • 常用 [ -F ] 选项

  • 定义分隔符

  • 当文档中没有 空格 时 , 默认为一行内容 , 此时需要定义分隔符

  • 处理文本时 , 默认将 空格 , 制表符作为分隔符

print 指令
  • print 是常用的编辑指令

  • 若有多条编辑指令 , 可用分号分割

  • Awk过滤数据时 , 支持仅打印某一列 , 如第二列 , 第三列

  • 当定义了条件且指令就是print时可以省略指令不写

awk -F: '$7~/bash/&&$3<=500' user       
                 #找第7列包含bash并且第3列小于等于500的行
条件 ’ / 字符串/ ’
常用内置变量

[ $0 ] ---------- 文本当前的全部内容

[ $1 ] ---------- 文本的第一列

[ $2 ] ---------- 文本的第二列

[ NR ] ---------- 文本当前行的行号

[ NF ] ---------- 文本当前行的列数( 有几列 )

print , 条件 , 内置变量
awk '{print}' abc.txt                #输出所有
awk '/to/{print}' abc.txt            #输出有to的那行
awk '{print $2}' abc.txt            #输出所有行的第2列
awk '/to/{print $1}' abc.txt        #输出有to的那行的第1列
awk '{print $0}' abc.txt            #输出所有行所有列
awk '{print $0,$1}' abc.txt        #输出所有行所有列,第1列
awk '{print NR}' abc.txt            #输出所有行的行号
awk '{print NR,$0}' abc.txt        #输出所有行的行号,所有列
awk '{print NR,NF}' abc.txt        #输出所有行的行号,列号(有几列)
[ -F ] 定义分割符
  1. 定义一个分隔符

    定义 ’ : ’ 为分隔符 [ -F: ]

awk -F: '{print $1}'  user       #文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}'  user     #使用冒号作为列的分隔符,显示第1、6列
  1. 定义多个分隔符

    定义 ’ : ’ ’ / ’ 为分隔符 ’ -F [ 😕 ] ’

awk -F [:/] '/^root/{print $1,$10}' user
print 输出打印常量
awk -F: '{print $1" 的家目录是 "$6}'  user    #输出常量,加双引号即可
awk -F: '{print $1" 的解释器是 "$7}'  user
格式化输出信息
  • awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。
  • 格式 :
    • 行前处理 : [ 在读取文件内容前执行 , 执行指令1次 ]
      • awk [ 选项 ] ’ BEGIN {指令} {指令}’
    • 行后处理 : [ 读取文件执行命令后执行 , 执行指令1次 ]
      • awk [ 选项 ] ’ END {指令} ’
    • awk [ 选项 ] ’ BEGIN {指令} {指令} END{指令} ’
    • 无需文档也能打印
awk -F: 'BEGIN{print "start"}{print $1}END{print "over"}' user
awk 'BEGIN{print NR}{print NR}END{print NR}' user
awk [ 条件 ]
  • 正则
    • ’ /正则/ ’
    • ’ ~ ’ 包含
    • ’ !~ ’ 不包含
awk -F: '$6~/root/{print}'  user    #输出第6列包含root的行
awk -F: '$6~/bin/{print}'  user     #输出第6列包含bin的行
awk -F: '$6!~/bin/{print}'  user    #输出第6列不包含bin的行
  • 使用 数字/字符串比较 设置条件

    • ’ == ’
    • ’ != ’
    • ’ > ’ ’ >= ’
    • ’ < ’ ’ <= ’
  awk -F: '$3<3{print}' user            #输出第3列小于3的行
  awk -F: '$3<=3{print}' user           #输出第3列小于等于3的行
  awk -F: 'NR==2{print}' user        	  #输出第2行
  awk -F: 'NR>2{print}' user            #输出行号大于2的行
  • 逻辑条件
    • ’ && ’ AND
    • ’ || ’ OR
    awk -F: 'NR>=3&&NR<=5{print}' user      #找行号是3~5行
    awk -F: 'NR==2||NR==4{print}' user      #找行号是2或者4的行
    awk -F: 'NR==2||NR==40{print}' user     #如果只有一个条件满足就显示一个
  • 数学运算
  awk 'NR%2==0{print NR,$0}' user  
                 #在条件中使用运算,找到将行号除以2余数等于0的行,然后输出该行的行号和所有列,相当于输出偶数行
awk 数组
  • 数组 , 是一个可以储存多个值的变量

  • 格式 :

    • 定义数组的格式 : 数组名[ 下标 ]=元素值
    • 调用数组的格式 : 数组名[ 下标 ]
    • 数组内是无序的 , 需要顺序要用 [ sort ]命令进行排序
      • sort #按照顺序排列
      • sort -n #以数值型进行排序,默认使用字符串排序;
      • sort -r #反序排列
awk 'BEGIN{a[1]=10;a[2]=20;print a[2],a[1]}'    
		#使用awk测试数组,创建数组a,下标1对应值是10,下标2对应值是20,然后输出下标是2与下标是1的值

awk数组的下标除了可以使用数字,也可以使用字符串,字符串需要使用双引号

awk 'BEGIN{a["abc"]="abcabc";a["xyz"]="xyzxyz";print a["xyz"]}' 
awk [ for ]循环

for ( 变量名 in 数组名 ) { print 变量名 }

awk  '{a[$1]++}END{print a["abc"]}'  shu.txt
awk  '{a[$1]++}END{for(i in a){print i,a[i]}}' shu.txt
awk  '{a[$1]++}END{for(i in a){print i,a[i]}}' shu.txt | sort

把每行第一列作为a[*]数组 , 进行读取,改写等操作.

a[ $1 ]++ => a[ $1 ]=a[ $1 ]+1 进行计数

  • 32
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值