awk基础(马哥视频)

awk基础

1.1 print

print的使用格式:

print item1,item2, ….

要点:

  1. 各项目自己使用逗号隔开,而输出时则以空白字符分隔;
  2. 输出的item可以为字符串或者数值,当前记录的字段(如$1)、变量或者awk的表达式;数值会先转换为字符串,而后再输出;
  3. print的命令后面的item可以省略,此时其功能相当于print $0,因此,如果想输出空白行,则需要使用print “”;

例子:

# awk ‘BEGIN {print “line one\nline two\nline three”}’

awk –F: ‘{print $1,$2}’ /etc/passwd

内置变量:

ORS(output record sepatator) (输出换行符)

OFS(output field separator)  (输出分隔符)

FS: field separator,默认是空白字符;(输入文件分隔符)

RS:Record separator,默认是换行字符;(输入文件换行符)

NR:The number of input records,awk命令所处理记录数:如果有多个文件,这个数目会把处理的多个文件中行统一计数;

NF:Number of Field,当前记录的field个数;

FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

ARGV:数组,保存命令行本身这个字符串,如awk’{print $0}’ a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;

ARGC:awk命令的参数的个数;

1.2 printf

print命令的使用格式:

printf format,item1,item2,….

要点:

  1. 与其print命令的最大不同是,printf需要指定format;
  2. format用于指定后面的每个item的输出格式;
  3. printf语句不会自动打印换行符;

format
格式的指示符都以%开头,后跟一个字符;如下:

%c:显示字符的ASCII码:

%d,%i:
十进制整数:

%e,%E:科学计数法显示数值;

%f:显示浮点数;

%g,%G:以科学计数法的格式或浮点数的格式显示数值;

%s:显示字符串

%u:无符号整数

%%:显示%自身

修饰符:

N:显示宽度;

-:做对齐

+:显示数值符号

例子:

#awk
–F: ‘{printf “%-15s %\n”,$1,$3 }’ /ect/passwd

1.3输出重定向

print
items > output-file

print
items >> output-file

特殊文件描述符:

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

/dev/df/N:某特定文件描述符,如/dev/stdin
就相当于/dev/fd/0;

例子

awk
–F: ‘{printf “%-15s %i\n”,$1,$3 > “/dev/stderr”}’
/etc/passwd

1.4 awk

awk
的使用格式:

awk
[options] ‘script’ file1,file2,….

awk
[options] ‘PATTERN {action}’ file1,file2, ….

-F
:

1、算术操作符:

-x:负值

+x:转换为数值

x^y:

x**y:次方

x*y:

x+y:

x-y:

x%y:

2、字符串操作符:

只有一个,而且不用写出来,用于实现字符串连接:

3、赋值操作符:

=、+=、-=、*=、/=、%=、^=、**=

++、--

需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应该为/[=]/代替

4、布尔值

awk中,任何非0值或非空字符串都为真,反之就为假;

5、比较操作符:

x
< y 、x
<=y、 x
> y、 x
>= y、 x
== y、x
!= y、x
~ y、x
!~ y

6、表达式间的逻辑关系:

&&
、||

7、条件表达式

selector?if-true-exp:if-false-exp

$A
> $B ? echo $A:echo $B

8、行数调用

function_name
(para1,para2)

9、awk的模式:

awk
‘program’ input-file1 input-file2 ….

其中的program为:

pattern
{ action }

pattern
{ action }

….

常见的模式类型:

  1. Regexp:正则表达式,格式为/regular
    expression/
  2. expression:表达式,其中值非0或为空字符时满足条件,如:$1
    ~/foo/ 或 $1==”magedu”,用运算符~(匹配)和~!(不匹配)
  3. Ranges:指定的匹配范围,格式为pat1,pat2
  4. BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次
  5. Empty(空模式):匹配任意输入行;

常见的Action有:

  1. Expressions
  2. Control
    statements
  3. Compound
    statements
  4. Input
    statements
  5. Output
    statements

/正则表达式/:使用通配符的扩展集

关系表达式:可以用下面运算符表中的关系符进行操作,可以是字符串或者数值的比较多,如$2
> $1 选择第二个字段比第一个字段长的行。

awk
–F: ‘$3 >= 500 {print $1}’ /ect/passwd

awk
–F: ‘$3 >= 500 {print $1,$3}’ /ect/passwd

awk
–F: ‘$3 >= 500 {printf “%-15s%s\n”,$1,$3}’ /ect/passwd

awk
–F: ‘$3 >= 500 {print “Username UID”;printf
“%-15s%s”,$1,$3}’ /ect/passwd

模式匹配表达式:

模式,模式:指定一个行的范围,该语法不能包括BEGIN和END模式

BEGIN:让用户指定在第一条输入记录被处理之前说发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作

awk
–F: ‘BEGIN {print “Username UID”}{printf “%-15s%s”,$1,$3}’
/ect/passwd

awk
–F: ‘BEGIN {print “Username UID”}{printf
“%-15s%s”,$1,$3}END{print “Over}’ /ect/passwd

awk
‘BEGIN {print “a” “b”}’

awk
–v FS=: ‘{print $1}’ /etc/passwd

awk
‘BEGIN{FS=”:”}{print $1}’ /ect/passwd

例子:

vim
a.txt

welcome
to redhat linux.

how
are you?

awk
‘{print $1}’ a.txt

df
–h

df
–h |awk ‘{print $1}’

df
–hP |awk ‘{print $1}’

awk
‘{print $1}’ /etc/passwd

awk
–F: ‘{print $1}’ /etc/passwd

awk
–F: ‘{print $1,$7}’ /etc/passwd

awk
–F: ‘{print $NF}’ /etc/passwd

awk
‘{print $NF}’ a.txt

awk
–v FS=: ‘{print $NF}’ /etc/passwd

awk
‘{print $1 $2}’ a.txt

awk
‘{print $1,$2}’ a.txt

awk
-v OFS=: ’{print $1,$2}’ a.txt

awk
‘{printf “%-10s,%s\n”,$1,$2}’ a.txt

awk
‘{printf “%-10s%s\n”,$1,$2}’ a.txt

awk
‘BEGIN{print “a” “b”}’

awk
–F: ‘$1 ~ /^root/{print $3,$4,$NF}’ /ect/passwd

awk
–F: ‘$1 !~ /^root/{print $3,$4,$NF}’ /ect/passwd

awk
–F: ‘/bash/{print $0}’ /etc/passwd

awk
–F: ‘/bash/{print $1}’ /etc/passwd

控制语句

  1. if-else

语法:if(condition)
(then-body) else{[ else-body]}

例子:

awk
–F: ‘{if ($1==”root”) print $1, “admin”;else print
$1,”Common User”}’ /ect/passwd

awk
–F: ‘{if($1==”root”) printf “%-15s:%s\n”,$1,”Admin”;else
printf “%-15s:%s\n”,$1, “Common User”}’ /ect/passwd

awk
–F: -v sum=0 ‘{if ($3 >= 500) sum ++}END {print sum}’
/ect/passwd

  1. while

语法:while
(condition) {statements1;statements2;……}

awk
–F: ‘{i=1;while (I <= 3) {print $1;i++}}’ /ect/passwd

awk
–F: ‘ $1!~/root/ {i=1;while (i <= 4) {print $1;i++}}’
/ect/passwd

awk
–F: ‘ $1!~/root/ {i=1;while (i <= NF) {print $1;i+=2}}’
/ect/passwd

awk
–F: ‘ $1!~/root/ {i=2;while (i <= NF) {print $1;i+=2}}’
/ect/passwd

  1. do-while

语法: do
{statements1;statements2;……} while (condition)

awk
–F: ‘{i=1; do {print $i;i++} while (i <=3) }’ /etc/passwd

  1. for

语法:for
(variable assignment;condition; iteration process ) {
statements1;statements2;…}

awk
–F: ‘{for (i=1;i<=3;i++) print $1}’ /ect/passwd

awk
–F: ‘{for (i=1;i<=NF;i+=2) print $i}’ /ect/passwd

for循环还可以用来遍历数组元素:

语法:for
(i in array ) {statements1;statements2;……}

awk
–F: ‘$NF!~/^$/{BASH[$NF]++}END{for (A in BASH) {printf
“%15s:%i\n”,A,BASH[A]}}’ /ect/passwd

  1. case

语法:seitch
(expression) {case VALUE or /ERGEXP/:
statements1;statements2;…default statements0 }

  1. break和continue

常用于循环或case语句中

  1. next

提前结束对本行文本的处理,并接着处理下一行

awk
内置变量:

FS:
field separator,默认是空白字符;

RS:Record
separator,默认是换行字符;

NR:The
number of input records,awk命令所处理记录数:如果有多个文件,这个数目会把处理的多个文件中行统一计数;

NF:Number
of Field,当前记录的field个数;

FNR:与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;

ARGV:数组,保存命令行本身这个字符串,如awk’{print
$0}’ a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;

ARGC:awk命令的参数的个数;

for
I in {0 .. 10}

print
A[$i]

for
(A in ARRAY) {print ARRAY[A]}

awk
‘BEGIN {A[“m”]=”hello”;A[“n”]=”world”;for (B in A)
print A[B]}’

awk
中使用数组

array[index-expression]

index-expression
可以使用任意字符串,需要注意的是,如果某数据组元素事项不存在,那么在应用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index
in array的方式。

要遍历数组中的每一个元素,需要使用如下的特殊结构:

for
(var in array) {statement1,…}

其中,var用于引用数组下标。

例子:

netstat
–n|awk ‘/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]}’

netstat
–ant |grep “LISTEN” |wc –l

netstat
–ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) print A,S[A]}’

netstat
–ant | awk ‘$1 ~/tcp/{S[$NF]++}END{for (A in S) printf
“%10s:%s\n”, A,S[A]}’

awk
–F: ‘$NF!~/^$/ {SHELL[$NF]++}END{for (A in SHELL) print
A,SHELL[A]}’ /etc/passwd

awk
‘{IP [$1]++}END{for (A in IP) print A,IP[A]}’
/usr/local/apach/logs/access_log

每出现一被/^tcp/模式匹配到的行,数组S[$NF]就加一,NF为当前匹配的行的最后一个字段,此处用其值作为数组S的元素索引;

awk
‘{count[$1]++};END {for (url in counts) print counts[url],url}’
/var/log/httpd/access_log

用法与上一个例子相同,用于统计日志文件中IP地址的访问量

awk
‘BEGIN{A[x]=”hello”;A[y]=”world”;print A[x],A[y]}’

awk的内置函数

split
(string, array [,fieldsep [,seps]])

功能:将string表示的字符串以filedsep为分隔符进行分割,并将分隔后的结果保存至array为名的数组中

netstat
–ant | awk ‘/:80/ {split($5,clients,”:”);IP[client[1]]++}END
{for (i in IP) {print IP[i],i}}’|sort –rn |head -50

将netstat
查询结果的第五列开始以:为分隔符开始切割,切割的结果保存在client数组中,并累计。

length([string])

功能:返回string字符串中字符的个数

substr
(string ,start[, length])

功能:取string字符串中的子串,从start开始,取length个,start从1开始计数;

system(command)

功能:执行系统command并将结果访问至awk命令

systime()

功能:取系统当前时间

awk
[options] ‘PATTERN{cation}’ input_file

awk基础(马哥视频)

时间: 2024-11-09 16:28:06

awk基础(马哥视频)的相关文章

DNS服务器配置小结(参考私房菜,马哥视频)

DNS原理方面的东西就不介绍了,具体的可以看私房菜的DNS服务器部分,讲的很好.主要跟着私房菜的思路在虚拟机中重新实践下了吧 a)需要注意一下几个重要的文件 /etc/named.conf主配置文件,有区域的定义,一定要记住 /var/named/这个文件夹下存放区域数据文件 /etc/rc.d/init.d/named命令可以使用reload,start,restart,stop /var/log/messages登录日志信息 b)几个检查是否有语法错误的命令named-checkconf;n

sed解析和用例(马哥视频笔记)

sed(流编辑器) sed基本用法: sed:Stream EDitor 行编辑器(另一种:全屏编辑器:vi.vim) sed:模式空间 sed默认部编辑源文件,仅对模式空间中的数据做处理:而后将模式空间打印到屏幕(默认朱行读取): sed 'AddressCommand'  file ... 对这个或者这种(file)文件当中的,符合这个地址指定范围(Address)内的行 实现执行以下编辑命令(Command). Address: 1.StartLine,Endline 比如1,100 $:

马哥视频

VIM编辑器 编辑模式   默认 输入模式   i 末行模式   : vim +# file   #打开文件后直接跳到第#行 vim + file   直接跳到尾行 vim  +/关键字    跳转到第一次出现的关键字的行首 i a o I A O  转换到输入模式 光标移动  h j k l  左下上右 w 移动到下一个单词的词首 e 当前或下一个单词的词尾 b  当前或前一个单词的词首 行内跳转   0 绝对行首  ^行首的第一个费空白字符 $绝对行尾 行间跳转  #G 跳转到第#行   G

马哥视频笔记:03_02 03_03 03_04

bash特征详解 B.C.K shell shell外壳 GUI:Gnome.KDE.Xfce CLI:sh.csh.ksh.bash(首选).tcsh 多用户登录到系统,使用shell,也只有一个shell程序在运行,但是可以有多个shell进程. *进程:在每个进程看来,当前主机上只存在内核和当前进程: 进程是程序的副本 用户工作环境: bash: #管理员的命令提示符 $普通用户 exit 退出当前shell(子shell) pstree Ctrl+a:跳到命令行首 Ctrl+e:跳到命令

马哥2013年运维视频笔记 day01 系统基础知识

没有什么可说的,马哥的Linux视频真的是精品,这里把我学习以后的笔记整理到这里,以备不时之需. day01 ①.Linux学习的一些方法论 做好总结,必须学习完一个知识点以后要用自己的思想把它彻底的给别人讲明白,这样这个知识就真的融入你们的知识体系了,否则看着会了,其实是一知半懂.比较好的方法就是写总结,记笔记,然后汇总成博客,这样可以锻炼你对问题条理化理解,这会影响你们的一生,是隐形的影响. 都说Linux很难,不然怎么体现你的价值啊?只有基础打牢,之后的中高级内容才能从容不迫.要做好知识结

马哥Linux2016最新高薪运维视频课程

马哥2016最新Linux高薪运维学习课程采用了RHEL 6.6和CentOS 7.1,全面介绍CentOS7全新特性,本课程加入实战式Shell.Mysql数据库入门.iptables入门及实战应用.Http协议缓存实战Varnish,Lamp及Lnmp组合进阶管理.自动化运维工具puppet精讲.KVM虚拟化技术精讲,全新课程体系完全贴合生产环境:加入以往没有的实战案例,让你感受课堂=实战!课程结构及内容深度优化,首次新增和更新知识幅度高达90%. "努力,让日子更从容.更愉悦.更优雅一些.

马哥预习视频

马哥预习视频第三天 linux 根文件系统 回顾:linux文件系统的特性,命令的使用帮助,常用的命令 如何使用帮助,内部命令help,外部man 官方文档 自带文档(README,CHANGELOG,INSTALL) 发行版的文档 google Linux 内核:documentation man非常重要:manual,使用手册 章节有很多whatis keyword man # KEYWORD SECTION: NAME: SYNOPSIS [],<>,|,{} .. 控制命令 space

马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文件系统管理详解之三10_05_脚本编程之八 脚本完成磁盘分区格式化20_01_DNS主从复制及区域传送04_04_grep及正则表达式01_03_操作系统基础08_02_bash脚本编程之七 case语句及脚本选项进阶14_03_bash脚本编程之十一(Linux启动流程之三) SysV服务脚本01

马哥教育视频学习笔记-shell脚本完成磁盘分区格式化

马哥教育视频学习笔记-shell脚本完成磁盘分区格式化-http://edu.51cto.com/lesson/id-28201.html 以下是脚本内容,内容比较简单,不做详解 在Linux上准备一块空闲的磁盘即可,如何分区可以在脚本内改下 #!/bin/bash # echo "Initial a disk..." echo -e "\033[31mWarning: \033[0m " #开始的说明信息,其中Warning以红色字体显示 fdisk -l 2&g