sed和awk的基础运用

sed文本编辑器(vim、notepad、world、wps)

sed逐行处理

sed 方式
用法一 前置命令: sed [选项] ‘条件指令’
用法二 sed [选项] ‘条件指令’ 文件

sed工具的选项:

-n  屏蔽默认输出   分号隔开;   逗号,什么到什么
-r  让sed支持正则表达式
-i  sed直接修改源文件

实战使用判断YUM源是否可用

a=`yum repolist|tail -1|sed 's/repolist: //g'|sed 's/,//g'`;[ "$a" -gt 0 ]&&echo "yum可以用!"

颠倒顺序

sed -r 's/^(.)(.)(.*)(.)(.)$/\1\4\3\2\5/' test.txt

sed 的相关命令:

sed的选项 作用
-p 打印
-d 删除
s/lod/new 修改
-a 追加
-i 插入
-c 修改(行)
-h/H 复制
-g/G 追加粘贴/覆盖粘贴

sed两个文件之间的操作:

sed ‘2r /etc/hosts’ test.txt   #读text.txt文件,到第二行时候将/etc/hosts内容导入
sed '1w net.txt' test.txt   #将test。txt内容第一行追加到net.txt中,文件不存在自动创建

awk基本的文本编辑器用法:

awk [选项]“[条件]{执令}”    #当没有指定分割符号,会使用默认的分隔符或者是制表符
-F 指定分隔符
    awk F[:/] 
-v 调用外部变量
    A=10
    awk -v y=$a '{y==1}'

NR 行数
NF 列数

awk示例

ifconfig enp1s0|awk '/TX p/{print "输出:",5}'    #显示当前的流量信息 ifconfig enp1s0|awk '/inet /{print 2}'     #显示当前的IP地址
df -h|awk '/\//{print "可用容量:",4}'       #显示当前的根目录的可用容量
cat /var/log/secure|awk '/Failed/{print $11}'   #显示当前的失败登入信息

awk的处理机制

awk [选项] ‘BEGIN{指令}{指令}END{指令}‘

判断当前的/etc/passwd下的所有的bash登入的帐号

awk -F[:] 'BEGIN{x=0}/bash/{x++;print $1}END{print "总计:"x}' /etc/passwd

对/etc/passwd的管理(两个写法):

awk -F[:] 'BEGIN{print "User\tUID\tHome\t"}{print 1"\t" 3"\t" 6}END{print "Total " NR " lines."}' /etc/passwd  awk -F[:] 'BEGIN{print "用户名","UID","家目录"}{print 1,3,6}END{print "Total " NR " lines."}' /etc/passwd|column -t

awk的判断比较

>  >=  <  <=  ==  !=

awk判断使用:

1.把账户中的UID大于等于1000的用户找出来/etc/passwd
awk -F: '3>=1000{print 1,3}' /etc/passwd  2.判断ID>1小于20的用户名称 awk -F: 'BEGIN{print "用户名称","ID"}3>1&&3<20{print 1,3}' /etc/passwd|column -t  3.判断能被3整除并且包含3的数字 time seq 2000000|awk '1%3==0&&1~/3/'  4.判断/etc/hosts下用127|172的IP打印出来 awk ‘/^(172|127)/’ /etc/passwd awk -F[.] 'BEGIN{print "当前的符合的IP地址:"}/^(172|127)/{print 1}' /etc/hosts |column -t

5.打印所有的能登入机器用户名和密码
a=`awk -F: '/bash/{print 1}' /etc/passwd`;echo "用户名   密码";for i in a;do awk -F: -v b=i '1==b{print 1,$2}' /etc/shadow;done|column -t

awk的高级使用:

awk支持if,for,while,break,continue

单分支if格式:

awk 选项 ‘BEGIN{指令} {指令} END{指令}’

示例:

统计/etc/passwd文件中的UID小于或等于1000的用户个数
awk -F: 'BEGIN{print "用户名","UID";x=0}{if(3<=1000){print 1,$3}{x++}}END{print "合计总数为:"x}' /etc/passwd|column -t

在server0或在desktop0上

yum -y install httpd
systemctl start httpd
firewall-cmd --default-zone=trusted
ab -c 100 -n 1000000 http://172.25.0.11   #模拟100个人,访问服务器100000次

重点使用:对IP访问次数进行过滤

awk '{ip[$1]++}END{for (i in ip){print i,ip[i]}}' /var/log/httpd/access_log 

示例:打印所有访问HTTP的IP地址

awk 'BEGIN{print "访问的IP","访问的次数"}{ip[$1]++}END{for (i in ip){print i,ip[i]}}' /var/log/httpd/access_log |sort -n|column -t

示例:打印所有登入过该计算机的IP地址

awk 'BEGIN{print "登入的次数","访问的IP地址"}11~/[1-9]{3}(.[0-9{1,3})]){3}/{ip[11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure|column -t

示例:打印所有曾经ssh访问失败的IP

awk 'BEGIN{print "登入失败的IP","登入失败的次数"}/Failed/{ip[11]++}END{for (i in ip){print i,ip[i]}}' /var/log/secure|column -t  echo !最后一个后台的进程号

综合运用:

屏蔽终端
#!/bin/bash 
echo>aa.txt
while :
do
a=`w |sed -n '3,99p'| awk '3=="176.121.206.129"{print 2}'`    #3为要过滤的ip b=`w |sed -n '4,99p'|grep -v "176.121.206.129"| awk 'length(3)<5{print 2}'`    #取反打印 [ "b" == "" ] && continue
c=`ps -A|grep "b"|grep "bash"|awk '4=="bash"{print 1}'` if [ `echo c|wc -L` -gt 2 ];then
        for i in c         do         kill -9 i
        echo i         done         #echo b
        b=""
fi
echo "当前已经杀死用户a,进程号:b">>aa.txt
sleep 1
done

快速获取前10IP

cat access.log |awk '{print $1}'|sort |uniq -c | sort  -nr |head -10

sed和awk的基础运用》有4个想法

  1. Thanks, I have recently been searching for information approximately this subject for a long time and yours is the greatest I have came upon till now. However, what in regards to the bottom line? Are you certain in regards to the source?

发表评论