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 ",$1,$3)}' passwd

awk -F ':'  '{print "user:"$1  " uid:"$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  Line  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}}' soce.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 .` 

原文地址:https://www.cnblogs.com/laosun0204/p/10541442.html