阅读原文:https://blog.51cto.com/5iqiong/633186
awk -F":" '{if($1~/root/) print $1}' /etc/passwd 打印包含root的行
awk -F":" '/root/{print $1}' /etc/passwd 匹配root,并打印第一列
awk '$2~/40[0-4]/||$2~/50[0-4]/{print $4}' 匹配第二列包含40x和50x的行,并打印这些行的第4列
awk -F":" '$4==100 {print $0}' /etc/passwd 打印第四列等于100的行
awk -F":" '$1 !~ /root/ {print $0}' /etc/passwd 打印不包含root的行
awk -F":" '$1 != “root” {print $0}' /etc/passwd 打印第一列不等于root的行
awk -F":" '$3 < $4 {print $0}' /etc/passwd 如果第三列小于第四列,则打印此行
awk -F":" '$3 + $4 == 155 {print $0}' /etc/passwd 匹配两列之和为155
awk -F":" ' {print $3,$4,"Total is:"$3 + $4 }' /etc/passwd 打印两列相加结果
awk '/[Rr]oot/' /etc/passwd 区配某字段
awk '/^...s/' /etc/passwd 抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/ ^ . . . a /意为行首前三个字符任意,第四个是a,尖角符号代表行首
awk '/(root|net|ucp)/' /etc/passwd 匹配包含root或net或ucp的任意行
awk '/^[0-9]/' group.txt 匹配以数字开头的行
awk 'NR>0 && NR<10{print NR,$0}' passwd 打印0-10之间的行,不包含第0行(通常是标题行)
awk 'NR>0 && ($3!=$4 || $3=0) {print}' 从非标题行开始匹配筛选第3列不等于第4列,或第3列为0的行
awk -F: 'NF>7 {print NF,$0}' passwd 打印大于7列的行
awk -F: '{if (NF==8 && NR==31)print NR,$1}' passwd 如果第31行超过8列,就打印这一行的第1列
awk 'gsub(/root/,"admin") {print $0}' passwd 将包含/root的字段替换为admin
awk -F: 'length($1)==4 {print $0,length($1)}' passwd 如果第一列长度为4则打印此行
awk '$3==day {print $0}' day=`date +%d` /tmp/te.log 将命令传给awk
using octal code for the single quote(\047) and forward slash(\057), eg
# 使用八进制代码表达单引号(\047)和正斜杠(\057)
$ cat file
include('./
$ awk '{gsub(/include\(\047\.\057/ , "include(\047" ) }1' file
include('
awk用法之 文本替换
awk的sub/gsub函数用来替换字符串,其语法格式是:
sub(/regexp/, replacement, target)
注意第三个参数target,如果忽略则使用$0作为参数,即整行文本。
注:sub 进行一次操作;gsub 进行全局操作。
例子1:替换单个串
只把每行的第一个AAAA替换为BBBB
awk '{sub(/AAAA/,"BBBB");print $0}' t.txt
例子2:替换所有的串
把每一行的所有AAAA替换为BBBB
awk '{gsub(/AAAA/,"BBBB");print $0}' t.txt
例子3:替换满足条件的行的串
只在出现字符串CCCC的前提下,将行中所有AAAA替换为BBBB
awk '/CCCC/{gsub(/AAAA/,"BBBB");print $0; next}{print $0}' t.txt
例子4:替换多个可选串
不管是AAAA,还是CCCC,全部替换为BBBB
awk '{gsub(/AAAA|aaaa/,"BBBB");print $0}' t.txt
例子5:全字匹配替换
全字匹配AAAA;即不匹配AAA,以及AAAAA,也就是说完整的四个字符串AAAA。
awk '{sub(/\<AAAA\>/,"BBBB");print $0}' t.txt
例子6:规则表达式匹配
把所有以A开头,不管后面连续包含几个A的串替换成一个字符B。
awk '{gsub(/^A*/,"B"); print $0}' t.txt
作者:CodingCode
链接:https://www.jianshu.com/p/d90f8a2ecd62
https://blog.csdn.net/bitcarmanlee/article/details/50975809
gsub(r,s) 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
awk -F "," '{str=gsub(/\t*| *$/,"",$3);ret=$1","$2","$3","NR;print ret}' # 去除第三个字段的空格与制表符
awk -F "\t" '{if($3=="吉林") {gsub($3,"吉林省",$3);print $0}}' area_province
220005 延边 吉林省
220007 松原 吉林省
229999 吉林其它 吉林省
对排好序的各个端数据取前1000
sort -t , -k3,3 -k4,4nr file | awk -F "," '{str=gsub(/\t*| *$/,"",$4);a[$3]++;{if(a[$3]<=1000) print $1","$2","$3","$4","a[$3]}}' z1 > zzz
# 这里 sort 的-t选项之后的逗号和 -k 选项之间必须有空格,-t, -k3,3 或 -t , -k3,3 都行。
其他参考:
https://www.cnblogs.com/emanlee/p/3327576.html
AWK技巧:
1、awk只处理第一个匹配的行,匹配后使用exit命令退出处理:
awk '/version/{print $1;exit;}' input.txt
处理3个匹配行后结束处理:
awk '/aa/{i++;if(i<3){print $0}else{exit;}}' file
2、只处理指定的行。NR表示输入文件的行号
awk 'NR==1,NR==5{print $0}' file
参考:awk如何只处理第N行就退出, chinaunix.net, http://bbs.chinaunix.net/thread-1679570-1-1.html
————————————————
版权声明:本文为CSDN博主「hongweigg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hongweigg/article/details/52469359
https://www.cnblogs.com/royfans/p/7743800.html
使用awk命令获取文本的某一行,某一列
1、打印文件的第一列(域) : awk '{print $1}' filename
2、打印文件的前两列(域) : awk '{print $1,$2}' filename
3、打印完第一列,然后打印第二列 : awk '{print $1 $2}' filename
4、打印文本文件的总行数 : awk 'END{print NR}' filename
5、打印文本第一行 :awk 'NR==1{print}' filename
6、打印文本第二行第一列 :sed -n "2, 1p" filename | awk 'print $1'
#(获取test文件的第4行)
# cat test| awk 'NR==4' 或 cat test|sed -n '4p' 直接获取某一行的数据
shell里面的赋值方法有两种,格式为
1) arg=`(命令)`
2) arg=$(命令)
因此,如果想要把某一文件的总行数赋值给变量nlines,可以表达为:
1) nlines=`(awk 'END{print NR}' filename)`
或者
2) nlines=$(awk 'END{print NR}' filename)
awk练习题
wang 4
cui 3
zhao 4
liu 3
liu 3
chang 5
li 2
1 通过第一个域找出字符长度为4的
2 当第二列值大于3时,创建空白文件,文件名为当前行第一个域$1 (touch $1)
3 将文档中 liu 字符串替换为 hong
4 求第二列的和
5 求第二列的平均值
6 求第二列中的最大值
7 将第一列过滤重复后,列出每一项,每一项的出现次数,每一项的大小总和
1、字符串长度
awk 'length($1)=="4"{print $1}'
2、执行系统命令
awk '{if($2>3){system ("touch "$1)}}'
3、gsub(/r/,"s",域) 在指定域(默认$0)中用s替代r (sed 's///g')
awk '{gsub(/liu/,"hong",$1);print $0}' a.txt
4、列求和
df -h | awk '{a+=$2}END{print a}'
5、列求平均值
df -h | awk '{a+=$2}END{print a/NR}'
df -h | awk '{a+=$2;b++}END{print a,a/b}'
6、列求最大值
df -h | awk 'BEGIN{a=0}{if($2>a) a=$2 }END{print a}'
7、将第一列过滤重复列出每一项,每一项的出现次数,每一项的大小总和
awk '{a[$1]++;b[$1]+=$2}END{for(i in a){print i,a[i],b[i]}}'
浙公网安备 33010602011771号