邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

Linux之awk命令

1.awk行处理方式与格式

awk一次处理一行内容
awk对每行可以切片处理

awk '{print $1}' //输出首个单词  uname -a | awk '{print $1}'

命令行格式
awk [options] 'command' file(s)
脚本格式
awk -f awk-script-file  file(s)

command1:pattern {awk操作命令}

操作命令:内置函数: print() printf() getline()
控制指令: if(){...}else{}  while(){...}

awk 内置变量 (1)
$0 表示整个当前行
$1 每行的第一个字段  
$2 每行的第二个字段  

awk内置参数 :分隔符
options : -F field-separator(默认是空格)

例子:
awk -F ':' '{print $1}' /etc/passwd  //打印用户名

awk 内置变量 (2)
NR:每行的记录号
NF:字段数量变量
FILENAME:正在处理的文件名
例子:
awk -F ':' '{print NR,NF,FILENAME}' /etc/passwd 



2.awk内嵌参数应用

awk内置参数应用
1)
awk -F ':' '{if($3>100)print $1,$3}' /etc/passwd
2)
sed -n '/FastCGI/P' error.log | awk '{print $1,$2}' 
等于
cat error.log |awk '/FastCGI/{print $1,$2}'

逻辑判断式
awk逻辑
~,!~ : 匹配正则表达式
==,!=,<,> : 判断逻辑表达式 
例子:
awk -F ':' '$1~/s.*/{print $1}' /etc/passwd  //匹配 s开头的用户名



使用awk扩展格式
awk [options] 'command' file(s)
command2扩展
BEGIN{print "start"}pattern{commands}END{print "end"}


3.awk内嵌程序应用

awk处理过程
案例(-)
统计当前文件夹下的文件/文件夹占用的大小
ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size/2014/2014"M"}'
案例(二)
统计显示/etc/passwd的账户总人数
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' /etc/passwd   //去掉空行

统计uid>100的用户名
awk -F ':' 'BEGIN{count=0}{if($3>100)name[count++]=$1}END{for(i=0;i<count;i++)print i,name[i]}' /etc/passwd

案例(三)
统计netstat -anp 状态下LISTENING和CONNECTED的连接数量
netstat -anp | awk '/CONNECTED|LISTENING/{if($4=="ACC"){sum[$7]++}else{sum[$6]++}}END{for(i in sum)print i,sum[i]}'
linux中awk命令的简单介绍和使用

1.字段以:分隔,打印第一列
awk -F":" '{print $1}' /etc/passwd

2.字段以:分隔,打印第一列和第三列
awk -F":" '{print $1 $3}' /etc/passwd  
awk -F":" '{print $1":"$3}' /etc/passwd

3.文件形式的执行
vim test.awk 写入
BEGIN {FS=":"}
{print $1}

awk -f test.awk /etc/passwd

4.普通过滤代码块
字段以:分隔,输出 以a开头的第一列数数据
awk  'BEGIN{FS=":"}  /^a/{print $1}'  /etc/passwd  

字段以:分隔,输出第一列为root的一行数据
awk  'BEGIN{FS=":"}  $1=="root"{print $0}'  /etc/passwd 

字段以:分隔,输出第七列为nologin的第一列数数据
awk  'BEGIN{FS=":"}  $7 ~ "nologin"{print $1}'  /etc/passwd

字段以:分隔,输出不包含nologin 的第一列数数据
awk  'BEGIN{FS=":"}  !/nologin/{print $1}'  /etc/passwd


5.字段分隔符(FS)
FS="\t+"   一个或者多个TAB分隔
FS="[[:space:]+]"  一个或者多个空白分隔 ,默认的
FS="(foo|:)"  以foo或者:分隔
 
 
6.字段数量(NF)
NF: number of fileds 字段数量,通常只读
NF==3{print "字段为3的行:" $0}
第二列之后的数据

  if(NF>2){
    print $1 $2 $3
  }
}
 
7.记录数量(NR)
NR: number of records 记录(行)数量,当前awk遍历过的函数,动态变化
NR==3{print "第三行"}
#跳过前10行

  if(NR>10){
    print $0
  }
}
 
8.FS和RS例子
my.txt
路人甲
电话:110
手机:138110

路人乙
电话:120
手机:138120
 
awk 'BEGIN{FS="\n";RS=""} {print $1"\t"$2"\t"$3}' my.txt 
说明: FS="/n" 每一列以\n(换行)来分隔, RS=""每一行以空格来分隔

结果如下
路人甲 电话:110 手机:138110

路人乙 电话:120 手机:138120


9.OFS和ORS
OFS:字段输出分隔符,默认是" "
ORS:记录输出分隔符,默认为"\n"

my.txt
路人甲
电话:110
手机:138110

路人乙
电话:120
手机:138120
 
awk 'BEGIN{FS="\n";RS="";OFS="\t";ORS="\n"} {print $1,$2,$3}' my.txt
说明: 
  FS="/n" 每一列以\n(换行)来分隔, RS=""每一行以 【空行】 来分隔
  OFS="/t" 每一列输出用 \t 来分隔, ORS=""每一行以 \n换行 来分隔

结果如下
路人甲 电话:110 手机:138110
路人乙 电话:120 手机:138120

10.循环语句
my.txt
路人甲
电话:110
手机:138110

路人乙
电话:120
手机:138120
QQ:123456
 
awk 'BEGIN{FS="\n";RS="";ORS=""} {for(x=1;x<=NF;x++){print $x"\t"}print "\n"}' my.txt

结果如下
路人甲 电话:110 手机:138110
路人乙 电话:120 手机:138120    QQ:123456

Linux 中查看文件第n行内容的命令
Linux 中查看文件第n行内容的命令

方法1:
head -m filename | tail -1                    //查看filename文件的第m行(tail -1 是数字1)
例子:head -100 data.txt | tail -1          //查看data.txt文件的第100行

方法2:
 nl filename | sed -n 'mp'                     //查看filename文件的第m行
例子:nl data.txt | sed -n '100p'             //查看data.txt文件的第100行

方法3:
sed -n 'mp' filename                            //查看filename文件的第m行
例子:sed -n '100p 'data.txt                   //查看data.txt文件的第100行

方法4:
awk 'NR==m' filename                        //查看filename文件的第m行
例子:awk 'NR==100 'data.txt               //查看data.txt文件的第100行

优惠券
广告位-淘宝
最新微语