Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391095
  • 博文数量: 117
  • 博客积分: 4416
  • 博客等级: 上校
  • 技术积分: 1135
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 14:16
个人简介

一生醉生忘死,就让他继续下去吧!

文章分类

全部博文(117)

分类: LINUX

2009-06-10 14:17:13

文件: awkdocument.pdf
大小: 881KB
下载: 下载

一、基础十二篇

二、十三问
 



====awk的内置变量=====
1==ARGC支持命令行中传入a w k脚本的参数个数。A R G V是A R G C的参数排列数组,其中每
一元素表示为ARGV[n],n为期望访问的命令行参数。
ENVIRON 支持系统设置的环境变量,要访问单独变量,使用实际变量名,例如E NVIRON[“EDITOR”]=“Vi”。
2===FILENAME支持a w k脚本实际操作的输入文件。因为a w k可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件。
F N R支持a w k目前操作的记录数。其变量值小于等于N R。如果脚本正在访问许多文件,每一新输入文件都将重新设置此变量。
3===FS用来在a w k中设置域分隔符,与命令行中- F选项功能相同。缺省情况下为空格。如果用逗号来作域分隔符,设置F S = ","。
4===NF支持记录域个数,在记录被读之后再设置。
5===OFS允许指定输出域分隔符,缺省为空格。如果想设置为#,写入O F S = " # "。
6===ORS为输出记录分隔符,缺省为新行( \ n)。
7===RS是记录分隔符,缺省为新行( \ n )。









awk 中判断条件的变化
awk '$1 =="solo"{print $0}' a.txt
awk '{if($1~/solo/print $0}' a.txt
awk '$0~/solo/{print $0}' a.txt
awk '$0~/solo' a.txt   ====>省略动作,打印全部
awk '{if($1>$2)print $0}' a.txt
awk '$1~/^[Gg]o/{print $0}' a.txt
awk '$1~/(green|yellow)/' a.txt
awk '{if($1=="aa" && $2=="bb")print $0}' a.txt
awk '{if($1=="aa" || $2~/bb/)print $0}' a.txt
echo a b c d |awk '{OFS=":";print $1, $2, $3, $4}'
========>引入变量,缩短语句
awk '{vara=$1;varb=$2;if(vara~/ddd/)print varb}' file
awk '{if($1=="var")$2+=3;print $2,$3}' file
awk '{if($1~ /^tmp/){$1="fuck";print $1,$2,$3}}'


统计一个目录下非目录文件的总大小:
ls -l|awk '$1~/^[^d]/{print $1,$8,$5}{tol+=$5}END{print "=======$tol="tol}'


awk '{if($1~/^[^d]/)print $1,$8,$5;tol+=$5}END{print "=======$tol="tol}')




df|awk '(tol+=$2){print tol}'
df|awk '{tol+=$2}{print tol}'
df|awk '{tol+=$2;print tol}'



=====>awk内置字符串参数:
g s u b ( r, s ) 在整个$ 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用$ 0中最左边最长的子串代替s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分

awk 'BEGIN{print split("123#456#678",myarray,"#")}'
====#表示分割后数组元素的个数

awk '$3~/1/{print substr($3,1,4)}' test
====假设第三个字段匹配1,返回第三个字段从1到4位置的字符

 awk '{str=" a few little folish";print substr(str,1,8)}' test   ====test为必须项,但是没有实际用途,=操作需要用{}括起来

 str="aaaadddfff";echo $str|awk '{print substr($str,1,7)}'======对外部变量的引入,给出从1到7的子串

str="aaaadddfff";echo $str|awk '{print substr($str,7)}'======对外部变量的引入,给出从7到最后的子串

==========awk printf格式===========
%c A S C I I字符
%d 整数
%e 浮点数,科学记数法
%f 浮点数,例如(1 2 3 . 4 4)
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s 字符串
%x 十六进制数

echo "65"|awk '{printf "%c\n",$0}'===>A

awk '{printf "%c\n",65}' word |uniq

awk '{printf "%-10s %20s\n",$1,$3}' test
=======10个字符左对齐第一列,20个字符右对齐第三列


=========>数字按照位数补零

awk '{printf "%010d %009s\n",$3,$4}' a.txt

=======>对数字型$3补零,补全10位,左对齐,只有右对齐的时候,才能对数字补零,当要补零时,位数前加一个0,表示需要补零,-表示左对齐,+表示右对齐

awk '{printf "%3f\n",999}' a.txt

=====》999.000000,打印浮点数

=======>引入外部变量

awk '{if($3>vara)printf "%08d %f\n",$3,$4}' vara=3 a.txt

=======>awk 中for循环的使用

echo "1 2 3 4 5 6 7 8 2 3 4 1 2"|awk '{for(i=1;i<=NF;i++)print $i}'

awk '{if ($10=="")print $1,$8,$9;else print $1,$8,$10}' file

=======>if else的应用

awk '{print $1,$8,$NF}' urfile

======>$NF为每一行的最后一列,因为列数可能不同


======>对于多个输入分隔符的使用

who|awk -F"[ /]+" '{OFS="$$$";print $1,$2,$3}'


 who|awk '{FS="[ /]";OFS="$$$";print $1,$2,$3}'

 

 




阅读(2657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~