awk操作符

算术操作符:  x+y, x-y, x*y, x/y, x^y, x%y      -x: 转换为负数      +x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符: =, +=, -=, *=, /=, %=, ^=  ++, --

比较操作符: ==, !=, >, >=, <, <=

awk  -F:   ‘!($3==0) {print $1}'   /etc/passwd

模式匹配符:  ~ 左边是否和右边匹配包含       !~ 是否不匹配

awk –F:   '$0 ~ /root/{print $1}‘    /etc/passwd

awk  –F:  ‘$3==0’       /etc/passwd

awk正则匹配表达式

(1)如果未指定:空模式,匹配每一行

(2) /regular expression/:仅处理能够模式匹配到的行,需要用/  /括起来

awk '/^UUID/{print $1}' /etc/fstab

(3) relational expression: 关系表达式,结果为“真”才会被处理

awk  ‘!0’  /etc/passwd

(4) line ranges:行范围

startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式

awk -F:   ‘/^root\>/,/^nobody\>/{print $1}'    /etc/passwd

(5) BEGIN/END模式

BEGIN{}: 仅在开始处理文件中的文本之前执行一次  END{}:仅在文本处理完成之后执行一次

awk控制语句

if-else   while循环  do-while循环   for循环  switch语句  break和continue

next:   提前结束对本行处理而直接进入下一行处理(awk自身循环)

awk -F: '{if($3%2!=0) next; print $1,$3}'    /etc/passwd

awk 自带对文件行内容的循环,awk使用循环一般是对切割数据列进行循环操作

awk 的基本格式  awk -F:  '{}'   filepath

性能比较

time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')

time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)

time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)

time(seq –s ”+” 10000|bc)

awk数组

默认是关联数组

若要遍历数组中的每个元素,要使用for循环

for(var in array) {for-body}   注意:var会遍历array的每个索引

awk函数

数值处理:

rand():返回0和1之间一个随机数   awk  'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'

字符串处理:

echo $a | awk -F "" '{for(i=1;i<=NF;i++){if($i ~ /^[0-9]+$/) printf"%s", $i}}'

length([s]):返回指定字符串的长度

sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s

echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)'

gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)'

split(s,array,[r]) 以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中, 第一个索引值为1,第二个索引值为2

netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}'

自定义函数

awk中调用shell命令

system命令

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用 空格分隔,或者说除了awk的变量外其他一律用""引用起来。

awk BEGIN'{system("hostname") }'   awk BEGIN'{system("ifconfig") }'

awk 'BEGIN{score=100; system("echo  your score is " score) }'

awk传递值给shell循环,shell命令不能直接在awk的action中执行

#!/bin/bash
awk '/^[0-9]/{ip[$1]++}END{for(i in ip){if(ip[i]>30) print i}}' access_log | while read ip; do
echo $ip
done

awk脚本

将awk程序写成脚本,直接调用或执行

向awk脚本传递参数

格式:  awkfile  var=value var2=value2... Inputfile

注意:在BEGIN过程中不可用.直到首行输入完成以后,变量才可用.可以通 过-v 参数,让awk在执行BEGIN之前得到变量的值.

命令行中每一个指定的变 量都需要一个-v参数

awk实例

./numgen.sh 3 4  |   grep -v "^$"    |   awk '{sum=0;for(i=1;i<=NF;i++){sum+=$i}; if($1>sum/NF){print NR}}'

 awk '{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}' /etc/rc.sysinit

 [root@centos7 ~]# awk '{if($NF=="m"){sum_m+=$2;num_m++} else{sum_f+=$2;num_f++}}END{printf "male:%.2f\nfemale:%.2f\n",sum_m/num_m,sum_f/num_f}' score
male:99.50
female:95.00
[root@centos7 ~]# awk '{pcount[$3]++;s[$3]+=$2}END{for(i in pcount){print i, pcount[i],s[i]/pcount[i]}}' score
m 99.5
f
[root@centos7 ~]# echo "2008:08:08 :08" | awk 'sub(/:/,"-",$1)'
-: :
[root@centos7 ~]# echo "2008:08:08 :08" | awk 'gsub(/:/,"-",$1)'
-- :
[root@centos7 ~]# echo "2008:08:08:08" | awk 'gsub(/:/,"-",$1)'
---
[root@centos7 ~]# head -n1 /etc/passwd | awk '{split($0,arr,":")}END{for(i in arr){print i,arr[i]}}' root
/root
/bin/bash
root
x [root@centos7 ~]# netstat -an |awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
192.168.33.1
0.0.0.0
 awk -F: -v i= 'i{print $0}' /etc/fstab
[root@centos7 ~]# awk '/^[^#]/' /etc/fstab
UUID=1ec9c7b3-bec1--9aad- / xfs defaults
UUID=df74adc0-09cd-4a97-a1e4-9f0d4a4b5796 /boot xfs defaults
UUID=bacf4f88-3be9-4e74-ba5b-90274a2099ab /data xfs defaults
UUID=339ab167-206a--a36d-8d575579959e swap swap defaults
[root@centos7 ~]# awk '/^ *#/' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar ::
#
[root@centos7 ~]# awk -F: '/\/bin\/bash$/{print $1,$NF}' /etc/passwd
root /bin/bash
yanxianghui /bin/bash
tomcat /bin/bash
[root@centos7 ~]# awk -F: '/^root\>/,/^mail\>/{print $1}' /etc/passwd
root
[root@centos7 ~]# df -h | awk -F% '$0 ~ /^\/dev\/sd/{print $1}'| awk '$5>=10'
/dev/sda1 1014M 194M 821M
[root@centos7 ~]# df -h | awk -F% '$0 ~ /^\/dev\/sd/{print $1}'
/dev/sda2 50G .2G 46G
/dev/sda3 30G 82M 30G
/dev/sda1 1014M 194M 821M
 [root@centos7 ~]# awk '/^[0-9]/{ip[$1]++}END{for (i in ip){print i,ip[i]}}' access_log
172.20.101.111
172.20.101.238
172.20.101.188

shell编程awk进阶的更多相关文章

  1. shell编程基础进阶

    为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...

  2. shell编程awk基础介绍

    awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行 ...

  3. Linux Shell编程 awk命令

    概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...

  4. Shell编程—gawk进阶

    1使用变量 awk编程语言支持两种不同类型的变量: 内建变量 自定义变量 1.1内建变量 1. 字段和记录分隔符变量 数据字段变量允许你使用美元符号($)和字段在该记录中的位置值来引用记录对应的字段. ...

  5. Shell编程—sed进阶

    1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...

  6. 【转】Shell编程进阶篇(完结)

    [转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...

  7. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

  8. Linux(8):linux三剑客sed和awk & Shell 编程(1)

    linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...

  9. shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计

    shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...

随机推荐

  1. [JS] Topic - variable and function hoisting

    Ref: 深入理解js的变量提升和函数提升 一.变量提升 简直就是es5的遗毒! console.log(global); // undefined 竟然能打印?因为变量提升,下一行就有定义 var ...

  2. Spring.NET依赖注入框架学习--实例化容器常用方法

    Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...

  3. redis-sentinel的理解实践

    一.前言 组内现在用的是redis 的sentinel. 本着实践的原则,对sentinel的几台服务器进行了网络或者抓包方面的实践. 一共三台redis服务器, 10.10.20.6, 10.10. ...

  4. MFC接收命令行参数的三种方法

    方法一: CString sCmdline = ::GetCommandLine(); AfxMessageBox(sCmdline); 将获取到 "C:\test\app.exe -1 - ...

  5. smartcrop.js 内容感知图像裁剪

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE

    U盘要求为 FAT32,MBR分区表 如果需要放 4GB 大文件,可以分两个分区,第一分区FAT32格式,放启动相关文件,第二个分区用 NTFS 格式,放其它资料. 最新 Win10 支持显示 U盘 ...

  7. CSS3 transition 属性过渡效果 详解

    CSS3 transition 允许 CSS 元素的属性值在一定的时间区间内平滑地过渡.我们可以在不使用 Flash 动画或 JavaScript 的情况下,在元素从一种样式变换为另一种样式时为元素添 ...

  8. Docker多主机网络

    网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...

  9. 泡泡一分钟:A Multi-Position Joint Particle Filtering Method for Vehicle Localization in Urban Area

    A Multi-Position Joint Particle Filtering Method for Vehicle Localization in Urban Area 城市车辆定位的多位置联合 ...

  10. nowcoder 211B - 列队 - [(伪·良心贪心)真·毒瘤暴力]

    题目链接:https://www.nowcoder.com/acm/contest/211/B 题目描述 炎热的早上,gal男神们被迫再操场上列队,gal男神们本来想排列成x∗x的正方形,可是因为操场 ...