linux_awk操作
使用awk命令,打印/etc/hosts文件中的所有ip地址?
cat /etc/hosts |awk '{print $1}'
awk的内置参数,$0表示整个当前行,$1代表第一个字段,$2代表第二个字段,$n代表第n个字段
awk -F ':' '{print NR,NF,FILENAME}' passwd,NR代表行号,NF代表字段数量(每行的列数),FILENAME代表正在处理的文件名
awk -F ':' '{printf("user:%s uid:%s\n",$1,$3)}' passwd
awk -F ':' '{print "user:"$1 "\tuid:"$3}' passwd
awk -F ':' '{if($3>100)print $1,$3}' passwd Uid大于100的,要用if判断
在服务器的日志中找出IP:172.29.10.22的访问日期(在/opt/lampp/logs目录下有access_log_201611140133这个文件,别的文件也可以)
substr截取字符串:返回从起始位置起,指定长度之子字符串,若未指定长度,则返回从起始位置到字符串末尾的子字符串,substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分,awk '/172.29.10.22/ {print substr($4,2)}' access_log_201611140133从第2个字符开始指定的字符串,也可以awk '/172.29.10.22/ {print substr($4,2,20)}' access_log_201611140133,还可以用sed -n '/172.29.10.22/p ' access_log_201611140133|awk '{print $4}'
awk逻辑判断式
~:匹配正则表达式,用户名以m开头的,awk -F ':' '$1~/^m.*/{print $1}' passwd
!~:不匹配正则表达式,用户名不以m开头的,awk -F ':' '$1!~/^m.*/{print $1}' passwd
判断逻辑表达式有==,!=,>,<,awk -F ':' '$3==或!=或>或<500 {print $1,$3}' passwd
awk扩展格式
BEGIN{print 'start'}pattern{awk命令}END{print 'end'},制表显示/etc/passwd对应的用户名,每行的行号,每行的列数
awk -F ':' 'BEGIN{print "User\t Line\t Col"} {print $1,NR,NF} END{print "-----"FILENAME"-----"}' passwd
统计当前文件夹下文件和文件夹占用的大小(就是文件+文件夹之和)
ls -al | awk 'BEGIN {count=0}{count+=$5}END{print count/1024/1024"G"}'
统计显示/etc/passwd的账户总人数(就是总的行数,一行就是一个账户,^$代表空行,$1!~/^$/是第一列不是空的账户)
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd
统计显示/etc/passwd中UID大于100的用户名
awk -F ':' 'BEGIN{count=0} $3>100{user[count++]=$1} END{for(i=0;i<count;i++) print i,user[i]}' passwd
统计access_log_201611140130日志中每个IP出现的次数(以空格分隔去掉-F,$1就是IP,如果字典里没有IP就放进去,有就+1)
awk '{arr[$1]++} END{for(key in arr) print key,arr[key]}' access_log_201611140130
打印出172.29.10.22 6,如果有别的IP也会把该IP出现的次数打印出来
1、匹配文件出现内容的行
awk '/Exception/ {print NR}' catalina.out
2、输出apache日志中的访问ip地址、访问路径和状态码
awk '{print "ip=="$1,"path=="$7,"code=="$9}' /opt/lampp/logs/access_log
3、将成绩不及格的学生名称输出
awk '{if($2>60){}else{print $1}}' score.txt
4、将mysql的进程号写到mysql.pid这个文件中
ps -ef|grep mysql|grep -v "grep"|awk '{print $2 > "mysql.pid"}'
awk vs sed
awk和sed都可以处理文本
awk侧重于复杂逻辑处理(统计数量用awk)
sed侧重于正则处理(修改用sed)
awk和sed可以共同使用
修改当前目录下所有包含aaa的文件,将aaa改成AAA
find . -name "*aaa*" -exec rename aaa AAA {} \;
find . -name "*aaa*" | xargs rename aaa AAA;
修改目录下所有的文件中每行包含aaa的,把aaa改成AAA
sed -i 's/aaa/AAA/g' `grep aaa -rl .`