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. ThinkingInJava 学习 之 0000005 访问权限控制

    1. 包:库单元 1. 代码组织 2. 创建独一无二的包名 3. 定制工具库 4. 用import改变行为 5. 对使用包的忠告 2. Java访问权限修饰词 1. 包访问权限 2. public : ...

  2. Tomcat -- 启动错误 -- 解决锦集

    java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter :在Tomacat7的context.xml文 ...

  3. c++11 auto 与 decltype 详解

    转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...

  4. 在浏览器中高效使用JavaScript module(模块)

    在浏览器中也可以使用JavaScript modules(模块功能)了.目前支持这一特性的浏览器包括: Safari 10.1. 谷歌浏览器(Canary 60) – 需要在chrome:flags里 ...

  5. vba 如何去掉返回结果两端的双引号?

    If Left(s, 1) = Chr(34) And Right(s, 1) = Chr(34) Then s = Mid(s, 2, Len(s) - 2) End If

  6. Android摸索一环境搭建

    用户场景:做语音保全,首先要拨打400号码,听到语音后需要先按1然后再拨打对方号码,那么问题就来了,如果我记不清楚对方号码!是不是很苦逼----我要先找到对方号码然后用笔或者其他方式把这个号码记录下来 ...

  7. EXSI中Linux安装tools

    挂载 mount /dev/cdrom /mnt/ 进入挂载目录复制安装包 cp VMwareTools-10.2.1-8267844.tar.gz /tmp/ 解压安装 cd /tmp/ tar - ...

  8. 2018ACM-ICPC南京区域赛---AJGIDKM

    含[最小球覆盖][最大流isap]模板. 题面pdf https://codeforc.es/gym/101981/attachments/download/7891/20182019-acmicpc ...

  9. vue 打包的项目当背景图路径错误

    当背景图路径错误时: 在build/utils.js中添加或更改这句话:publicPath: '../../',

  10. SQL Server 2012 安装过程详解(包含每一步设置的含义)

    转http://www.cnblogs.com/EastLiRoar/p/4051969.html 一.启动安装程序,点击“安装”选项卡,选择“全新SQL Server独立安装或向现有安装添加功能”. ...