awk基础学习
2012-07-02 16:02
169 查看
awk 处理流的形式也是一行一行的,读取一行然后按照指定的模式进行处理,处理完成后默认输出到终端。
awk [-F fild:separator] 'command' filename
[-F fild-separator ]是可选的,awk默认以空格作为缺省的分隔符号,在脚本中可以通过FS=“X”来设定,X是任意分割符。
表达式匹配的特殊字符
\ ^ $ . [ ] | ( ) * + ?
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F 选项
NF 浏览记录的域个数,用$NF可以表示最后一个域
NR 已读的记录数
OFS 输出域分隔符,OFS="#",输出分隔符就是#
ORS 输出记录分隔符
RS 控制记录分隔符
awk的正则表达式在//里面,模式匹配的sed差不多
找到所有含有root的行,打印第一个域
awk -F : '/root/{print $1}' /etc/passwd
找到行首是root的行,打印第一个域
awk -F : '/^root/{print $1}' /etc/passwd
用~来进行字段匹配,第一个域是root的行
awk -F : '$1~/root/' /etc/passwd
找到第一个域不是root的行
awk -F : '$1!~/root/' /etc/passwd
用print的时候,不同参数之间用逗号作分割符号,则输出以空格作为分割符号;若以空格作为参数分割符号,输出被不存在分隔符号
echo "etc/fire/test.c" | awk -F / '{print $1,$2,$3}' ==>> home fire test.c
echo "etc/fire/test.c" | awk -F / '{print $1 $2 $3}' ==>> homefiretest.c
开始结束都加hello,中间打印第一个域
awk -F: 'BEGIN{print "......hello.......\n"} {print $1} END{print ".........hello........\n"}' /etc/passwd
awk -F: '{if($1=="root")} print $0' /etc/passwd
找出第三个域值是32的行
awk -F: '{if($3=="32") print $0}' /etc/passwd
不等于
找出第一个域不是root的行
awk -F: '{if($1!="root") print $0}' /etc/passwd
与
找出第一个域是root并且第五个域也是root的行
awk -F: '{if($1=="root"&&$5=="root") print $0}' /etc/passwd
NF:每行记录域的总个数
awk -F: '{print NF}' /etc/passwd
NR:已读记录域的数目
awk -F: '{print NR}' /etc/passwd
每行首加总域数和已读域数
awk -F: '{print NF,NR,$0}' /etc/passwd
在保证一行的域大于0,一个域是root的情况下,打印所在行号和行
awk -F: '{if(NF>0 && $1=="root") print NR,$0}' /etc/passwd
显示当前目录的名字,用$NF来显示最后一个域
pwd | awk -F / '{print $NF}'
显示一个目录的文件名字
echo "/home/firefoxbug/test.c" | awk -F / '{print $NF}'
找到第一个域是root行,并把第三个域加3,第四个域加4
可以用{}对匹配的行进行操作,若要执行多条语句,用;分割
awk -F: '{if($1=="root"){$3=$3+3;$4=$4+4;print $0}}' /etc/passwd
在每行最后添加一个域,域值是第三个域值和第四个域值的和
awk -F: '{$(NF+1)=$3+$4;print $(NF)}' /etc/passwd
统计当前目录下所有文件长度,首先排除目录,然后求得ls -l 的第五个域总和
ls -l | grep '^[^d]' | awk '{print $5;total=total+$5} END{print total}'
awk的printf函数,printf函数用法和C语言类似
awk 'BEGIN{printf ("%s\n","hello")}'
awk命令中传递参数
awk '模式' 变量=值 filename
比如查看 df -k 第四个域大于TARGET的项,其中TARGET是用户指定的
df -k | awk '{ if($4>TARGET) {printf ("%s : %d\n",$6,$4) } }' TARGET=650000
查看/etc/passwd下第一个域是USER的行,其中USER由用户指定
awk -F : '{if ($1==USER) {printf ("HAVE %s\n",$1) }}' USER=root /etc/passwd
awk [-F fild:separator] 'command' filename
[-F fild-separator ]是可选的,awk默认以空格作为缺省的分隔符号,在脚本中可以通过FS=“X”来设定,X是任意分割符。
表达式匹配的特殊字符
\ ^ $ . [ ] | ( ) * + ?
awk 内置变量
ARGC 命令行参数个数ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行- F 选项
NF 浏览记录的域个数,用$NF可以表示最后一个域
NR 已读的记录数
OFS 输出域分隔符,OFS="#",输出分隔符就是#
ORS 输出记录分隔符
RS 控制记录分隔符
awk的正则表达式在//里面,模式匹配的sed差不多
找到所有含有root的行,打印第一个域
awk -F : '/root/{print $1}' /etc/passwd
找到行首是root的行,打印第一个域
awk -F : '/^root/{print $1}' /etc/passwd
用~来进行字段匹配,第一个域是root的行
awk -F : '$1~/root/' /etc/passwd
找到第一个域不是root的行
awk -F : '$1!~/root/' /etc/passwd
用print的时候,不同参数之间用逗号作分割符号,则输出以空格作为分割符号;若以空格作为参数分割符号,输出被不存在分隔符号
echo "etc/fire/test.c" | awk -F / '{print $1,$2,$3}' ==>> home fire test.c
echo "etc/fire/test.c" | awk -F / '{print $1 $2 $3}' ==>> homefiretest.c
开始结束都加hello,中间打印第一个域
awk -F: 'BEGIN{print "......hello.......\n"} {print $1} END{print ".........hello........\n"}' /etc/passwd
使用if语句进行匹配
找出第一个域是root的行,注意不能写成=,如果写出=,那么就把所有行的第一个域都赋值为root,所有行都匹配awk -F: '{if($1=="root")} print $0' /etc/passwd
找出第三个域值是32的行
awk -F: '{if($3=="32") print $0}' /etc/passwd
不等于
找出第一个域不是root的行
awk -F: '{if($1!="root") print $0}' /etc/passwd
与
找出第一个域是root并且第五个域也是root的行
awk -F: '{if($1=="root"&&$5=="root") print $0}' /etc/passwd
NF:每行记录域的总个数
awk -F: '{print NF}' /etc/passwd
NR:已读记录域的数目
awk -F: '{print NR}' /etc/passwd
每行首加总域数和已读域数
awk -F: '{print NF,NR,$0}' /etc/passwd
在保证一行的域大于0,一个域是root的情况下,打印所在行号和行
awk -F: '{if(NF>0 && $1=="root") print NR,$0}' /etc/passwd
显示当前目录的名字,用$NF来显示最后一个域
pwd | awk -F / '{print $NF}'
显示一个目录的文件名字
echo "/home/firefoxbug/test.c" | awk -F / '{print $NF}'
找到第一个域是root行,并把第三个域加3,第四个域加4
可以用{}对匹配的行进行操作,若要执行多条语句,用;分割
awk -F: '{if($1=="root"){$3=$3+3;$4=$4+4;print $0}}' /etc/passwd
在每行最后添加一个域,域值是第三个域值和第四个域值的和
awk -F: '{$(NF+1)=$3+$4;print $(NF)}' /etc/passwd
统计当前目录下所有文件长度,首先排除目录,然后求得ls -l 的第五个域总和
ls -l | grep '^[^d]' | awk '{print $5;total=total+$5} END{print total}'
awk的printf函数,printf函数用法和C语言类似
awk 'BEGIN{printf ("%s\n","hello")}'
awk命令中传递参数
awk '模式' 变量=值 filename
比如查看 df -k 第四个域大于TARGET的项,其中TARGET是用户指定的
df -k | awk '{ if($4>TARGET) {printf ("%s : %d\n",$6,$4) } }' TARGET=650000
查看/etc/passwd下第一个域是USER的行,其中USER由用户指定
awk -F : '{if ($1==USER) {printf ("HAVE %s\n",$1) }}' USER=root /etc/passwd
相关文章推荐
- GAWK 学习:AWK 语言基础
- AWK 学习(一) 基础归纳
- awk学习--基础篇
- JavaScript基础知识学习笔记
- java基础学习总结——哈希编码
- 委托学习——基础
- JAVASCRIPT基础学习篇(11)--ECMAScript Basic7(The Browser Object Model)
- 机器学习之监督学习基础
- Java基础学习总结(32)——Java项目命名规范
- 适合新手的JavaScript基础学习笔记
- 零基础入门深度学习(2) - 线性单元和梯度下降
- Hibernate及Struts框架基础学习(一)
- QTP基础学习(二)启动与设置
- 信息安全系统设计基础第二周学习总结
- 零基础入门学习Python(1)
- SpringBoot学习-第一章 新的Spring基础-<Spring Boot 实战>
- java===java基础学习(10)---对象构造
- AS3.0基础学习笔记(6): 类继承
- 计算广告学习笔记1.7 广告的基础知识-广告搜索与推荐的区别
- 【算法学习笔记】08.数据结构基础 二叉树初步练习1