sed-awk命令详解

 


第2章 ***********sed***********. 1目  录

2.1 -------sed命令小结及小结图---- 1

2.2 -------第几行---------- 2

2.3 -------最后一行---------- 2

2.4 ---------从哪行到哪行-------- 3

2.5 -------某几行--------- 3

2.6 ---------上插入行----------- 3

2.7 -----------不包含oldboy(条件)----- 4

2.8 -----sed不显示空行----------- 4

2.9 ------------把所有小写字母()起来----- 4

2.10 -----变量运用------ 5

2.11 --------------命令行chkconfig优化开机自启----- 6

2.12 ----------找特定行替换某一些内容----- 6

2.13 -----------显示和不显示,要取消默认输出... 7

2.14 --------------chkconfig 用sed优化----------- 8

第3章 -------shell基础------- 9

3.1 --------写脚本---- 9

3.2 -------------变量-------- 9

3.3 -----------永久生效有几种-- 10

3.4 ---------  普通变量,环境变量与脚本---------- 10

3.5 ------------------vim批量加内容v  Ctrl+v---- 11

3.6 ----------awk支持小数的计算------------ 11

3.7 ---------read与计算应用----------- 12

3.8 --------------test和[  ] 进行条件判断----------------- 14

3.9 ----&& || 条件判断---------- 14

3.10 ------------如果---- 15

3.11 -----------if条件判断------- 15

3.12 -------------- 参数个数判断------------- 15

3.13 ------------for循环------- 18

3.14 ------------chkconfig优化开机自启动服务的脚本----- 19

3.15 ------------出错暂时无法解决的脚本-------- 19

3.16 ------------应该再来一个对是否是数字的判断----- 20

3.17 ------------查看脚本执行的状况- sh -x  --------- 21

第4章 **************awk*******. 21

4.1 ------awk执行流程图... 21

4.2 -----------awk数组结构-------- 22

4.3 ------awk执行过程表--------- 22

4.4 ---------awk分隔符哪行哪列-------- 24

4.5 --------awk题---------- 24

4.6 -----------awk替换------------ 26

4.7 ----企业案例3:统计/etc/services文件里面的空行数量--- 27

4.8 --------awk 数组----------- 28

4.9 -------企业面试题1:统计域名访问次数---- 处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题) http://www.etiantian.org/index.html http://www.etiantian.org/1.html http://post.etiantian.org/index.html http://mp3.etiantian.org/index.html http://www.etiantian.org/3.html http://post.etiantian.org/2.html 30

4.10 ---------awk统计的课后题------- 31

4.11 ----------awk识别花括号加条件---- 34

4.12 ----- a[$1]=a[$1]+$2----- 35

4.13 5. ip出现次数及使用流量... 36

4.14 ------awk 中的begin---------- 40

4.15 ------------awk版本4以上有替换功能----- 41

第5章 ---------总结大集合----- 41

5.1 -------查看端口总结  踢死了妮妮(tslnn)------- 42

5.2 ----------- 排查无法上网总结  3p----- 43

5.3 --------------  vi/vim快捷方式总结---- 44

5.4 ---sed总结-------- 46

5.5 ------awk总结--------- 46

5.6 ------rename----- 47

第2章 ***********sed***********

2.1 -------sed命令小结及小结图----

sed 参数 条件 命令(sed内置命令) 文件

        命令:i,a,d,s,p

默认输出,取消默认输出;找谁做什么,不做什么,(替换不替换,显示不显示,可以插加不插加吗,可以删不删吗)

!:放在命令前吗? 

增:(行号i  行号a 内容)上插下追,insert append ,加多行操作 cat也能多行追加

删:d    同,命令改d

改(替换):'Ms###Ng' M查找s 替换, g 全局替换 缺省替换行第一个,加数字几就是找到的第几个进行替换,ng从哪个到最后替换。变化的定义成变量,再替换,双引号解析,双引号变量替换成变量。找到哪行替换,找到不包含谁的行不替换(排除哪行其他行替换)

           四组长吴 2017/9/19 9:02:59

           可以sed '2s#[0-9]#<&>#2p'  精准定位到第二行的第二个匹      配项

查:p,-n打印经常要取消默认输出, ;单行,多行,第几行到第几行,哪儿到哪儿,逗号隔开,;某几行,分号隔开条件加命令;日志第一个15到第一个08,最后一行$

p和d显示不显示谁,d相当于排除显示

 

cat >person.txt <<EOF
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

2.2 -------第几行----------

[root@小马过河 old]# sed -n '3p' person.txt

103,Alex,COO

[root@小马过河 old]# sed -n '/oldboy/p' person.txt

101,oldboy,CEO

2.3 -------最后一行----------

方法一:

[root@小马过河 old]# sed -n '$p' person.txt

105,feixue,CIO

方法二:

[root@小马过河 old]# sed -n "$p" person.txt

105,feixue,CIO

2.4 ---------从哪行到哪行--------

[root@小马过河 old]# sed -n '2,4p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

[root@小马过河 old]# sed -n '/zhangyao/,/yy/p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

[root@小马过河 old]#

2.5 -------某几行---------

[root@小马过河 old]# sed -n '2p;3p;5p' person.txt

102,zhangyao,CTO

103,Alex,COO

105,feixue,CIO

lrzsz  zip文件两个系统均能用,xshell属性指定下载/加载路径

离开死s,过来ri

[root@小马过河 old]# zip -r a.zip /etc/services 
  adding: etc/services (deflated 80%)

压缩了百分比

2.6 ---------上插入行-----------

[root@小马过河 old]# sed '/zhangyao/i wo shi machangwei' person.txt

101,oldboy,CEO

wo shi machangwei

102,zhangyao,CTO

2.7 -----------不包含oldboy(条件)-----

方法一:

[root@小马过河 old]# sed  -n '/oldboy/!p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

方法二:

[root@小马过河 old]# sed '/oldboy/d' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2.8 -----sed不显示空行-----------

[root@小马过河 ~]# cat 1.txt |sed  '/[a-z0-9:/]/!d'

  root:x:0:0:root:/root:/bin/bash

 bin:x:1:1:bin:/bin:/sbin/nologin

  daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

2.9 ------------把所有小写字母()起来-----

[root@小马过河 ~]# sed 's#([a-z])#(1)#g' 1.txt -r

  (r)(o)(o)(t):(x):0:0:(r)(o)(o)(t):/(r)(o)(o)(t):/(b)(i)(n)/(b)(a)(s)(h)

 

 (b)(i)(n):(x):1:1:(b)(i)(n):/(b)(i)(n):/(s)(b)(i)(n)/(n)(o)(l)(o)(g)(i)(n)

[root@小马过河 ~]# sed 's#[0-9]#<&>#3' person.txt

10<1>,oldboy,CEO

10<2>,zhangyao,CTO

10<3>,Alex,COO

10<4>,yy,CFO

10<5>,feixue,CIO

[root@小马过河 ~]# sed 's#,#(,)#' person.txt

101(,)oldboy,CEO

102(,)zhangyao,CTO

103(,)Alex,COO

104(,)yy,CFO

105(,)feixue,CIO

2.10 -----变量运用------

[root@小马过河 ~]# sed "s#$ma#m#g" person.txt

101,oldboy,mEO

102,zhangyao,mTO

103,Alex,mOO

104,yy,mFO

105,feixue,mIO

[root@小马过河 ~]# sed "s#$ma#m$mam#g" person.txt

101,oldboy,mEO

102,zhangyao,mTO

103,Alex,mOO

104,yy,mFO

105,feixue,mIO

[root@小马过河 ~]# sed "s#$ma#m$ma#g" person.txt

101,oldboy,mCEO

102,zhangyao,mCTO

103,Alex,mCOO

104,yy,mCFO

105,feixue,mCIO

[root@小马过河 ~]# sed "s#$ma#$ma#g" person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@小马过河 ~]# sed "s#$ma#$mam#g" person.txt

101,oldboy,EO

102,zhangyao,TO

103,Alex,OO

104,yy,FO

105,feixue,IO

[root@小马过河 ~]#

2.11 --------------命令行chkconfig优化开机自启-----

[root@小马过河 ~]# chkconfig|sed -rn '/sshd|network|rsyslog|crond|systat/!s#^(.*)0:.*$#chkconfig 1 off#gp'|bash

找到!不替换,取消它的默认输出,

[root@小马过河 ~]#

[root@小马过河 ~]# chkconfig|sed -r '/sshd|network|rsyslog|crond|systat/d'|sed -r 's#^(.*)0:.*$#chkconfig 1 off#g'|bash

[root@小马过河 ~]# chkconfig

2.12 ----------找特定行替换某一些内容-----

其他行为默认输出

[root@小马过河 ~]# sed '/yy/s#[0-9]##g' person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

,yy,CFO

105,feixue,CIO

不包含yy的行前面的数字替换,默认输出和取消默认输出

[root@小马过河 ~]# sed -n '/yy/s#[0-9]##gp' person.txt

,yy,CFO

 

[root@小马过河 ~]# sed -n '/yy/!s#[0-9]##gp' person.txt

,oldboy,CEO

,zhangyao,CTO

,Alex,COO

,feixue,CIO

root@小马过河 ~]# sed '/yy/!s#[0-9]##g' person.txt

,oldboy,CEO

,zhangyao,CTO

,Alex,COO

104,yy,CFO

,feixue,CIO

2.13 -----------显示和不显示,要取消默认输出

[root@小马过河 ~]# sed -n '/old/!p' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@小马过河 ~]# sed -n '/old/p' person.txt

101,oldb

除了要找的显示一次其余的显示两次

[root@小马过河 ~]# sed '/old/!p' person.txt

101,oldboy,CEO

102,zhangyao,CTO

102,zhangyao,CTO

103,Alex,COO

103,Alex,COO

104,yy,CFO

104,yy,CFO

105,feixue,CIO

105,feixue,CIO

找到谁不删除和找到谁删除,不需要取消默认输出,可以用来显示哪行不显示哪行(不要空要空呢?)

[root@小马过河 ~]# sed  '/old/d' person.txt

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@小马过河 ~]# sed  '/old/!d' person.txt

101,oldboy,CEO

2.14 --------------chkconfig 用sed优化-----------

方法总结:如果想要引用一堆东西中的某一列然后批量生成其它的东西,一个方法是用sed找到找一列,保护起来反向引用替换成想要的批量命令,交给bash执行。即是用sed批量生成含有某一列变量的各种内容

先批量显示一下做得命令,不要忘了交给bash执行。for循环哪里也有一个方法

sshd                 0:off      1:off      2:on       3:on       4:on       5:on       6:off

svnserve       0:off      1:off      2:on       3:on       4:on       5:on       6:off

sysstat        0:off      1:on       2:off      3:off      4:off      5:off      6:off

udev-post             0:off      1:on       2:on       3:on       4:on       5:on       6:off

[root@小马过河 scripts]# chkconfig|sed -nr '/sshd|network|crond|sysstat|rsyslog/!s#(.*)0:.*#chkconfig 1 off#gp'|bash

[root@小马过河 scripts]# chkconfig

abrt-ccpp      0:off      1:off      2:off      3:off      4:off      5:off      6:off

abrtd                 0:off      1:off      2:off      3:off      4:off      5:off      6:off

acpid                0:off      1:off      2:off      3:off      4:off      5:off      6:off

atd                  0:off      1:off      2:off      3:off      4:off      5:off      6:off

auditd                0:off      1:off      2:off      3:off      4:off      5:off      6:off

blk-availability    0:off      1:on       2:off      3:off      4:off      5:off      6:off

cpuspeed             0:off      1:on       2:off      3:off      4:off      5:off      6:off

crond                0:off      1:off      2:on       3:on       4:on       5:on       6:off

条件,判断,循环,变量

定义函数,case判断执行

第3章 -------shell基础-------

3.1 --------写脚本----

命令解释器:(几个人,交给bash执行)

注释:路径,作者

脚本

--------- 

绝对路径,相对路径执行脚本 相对要有执行权限

3.2 -------------变量--------

环境变量  普通变量   特殊变量

sed 外面删除内容

3.3 -----------永久生效有几种--

3.4 ---------  普通变量,环境变量与脚本----------

执行脚本使用变量,普通变量放入脚本或(export)定义成环境变量才可以

                      a=213

[root@小马过河 scripts]# sh a

 

[root@小马过河 scripts]# export a=213

[root@小马过河 scripts]# sh a

213

unset 变量 取消变量,环境的也可以

用户登录显示的东西,运行的脚本/etc/profile.d/

/etc/profile、/etc/bashrc、
        /etc/profile.d/   
~/.bash_profile ~/.bashrc

[root@小马过河 profile.d]# ma=2

[root@小马过河 profile.d]# echo $ma

2

[root@小马过河 profile.d]# echo $mam

 

[root@小马过河 profile.d]# echo $ma m

2 m

[root@小马过河 profile.d]# echo "$ma"m                     方法一

2m

[root@小马过河 profile.d]# echo ${ma}m                     方法二

2m

[root@小马过河 profile.d]# echo ·$m·am                      错误一

··am

[root@小马过河 scripts]# echo `$a`a                          错误二

-bash: 1: command not found

a

[root@小马过河 scripts]# echo $($a)a                         错误三

-bash: 1: command not found

a

3.5 ------------------vim批量加内容v  Ctrl+v----

单用户进入,救援模式进入

vi从第几行到最后一行,:n,$s###g

当前行到最后一行:  :.$

所有航

批量加内容v  Ctrl+v 上下左右选中输入内容,按Esc退出,不能用Alt选中,因为Alt是xshell功能,不是vim的功能

3.6 ----------awk支持小数的计算------------

[root@小马过河 scripts]# awk -va=1 -vb=3 'BEGIN{print a/b}'

0.333333

[root@小马过河 scripts]# vim 1.t

#!/bin/bash

echo $1 $3 $0 $#                                  怎么使用参数

[root@小马过河 scripts]# sh 1.t

1.t 0

[root@小马过河 scripts]# sh 1.t a b c d e

a c 1.t 5

[root@小马过河 scripts]# echo $?             #$?看上一个命令执行的状况

                               可以看命令行的,可以看脚本执行情况的

0

[root@小马过河 scripts]# s 1.t a b c d e

-bash: s: command not found

[root@小马过河 scripts]# echo $?                    

127

$?有脚本?

:noh

3.7 ---------read与计算应用-----------

[root@小马过河 scripts]# vim cal.sh

#!/bin/bash

read  -t40 -p "输入你的游戏帐号:" a

read  -t40 -p "输入你的游戏帐号:" b

#a=$1

#b=$2

#echo a + b|bc

#echo a - b|bc

#echo a * b|bc

#echo a / b|bc

#echo a \% b|bc

#echo a ^ b|bc

awk -va=$a -vb=$b 'BEGIN{print a+b}'

awk -va=$a -vb=$b 'BEGIN{print a-b}'

awk -va=$a -vb=$b 'BEGIN{print a*b}'

awk -va=$a -vb=$b 'BEGIN{print a/b}'

awk -va=$a -vb=$b 'BEGIN{print a%b}'

awk -va=$a -vb=$b 'BEGIN{print a^b}'

~                                                  

~                                                  

"cal.sh" 17L, 434C written       

[root@小马过河 scripts]# sh cal.sh

输入你的游戏帐号:4  

输入你的游戏帐号:3

7

1

12

1.33333

1

64

[root@小马过河 scripts]# vim cal.sh

#!/bin/bash

read  -t40 -p "输入你的游戏帐号:" a

read  -t40 -p "输入你的游戏帐号:" b

echo $a + $b|bc

echo $a - $b|bc

echo $a * $b|bc

echo $a / $b|bc

echo $a \% $b|bc

echo $a ^ $b|bc

#awk -va=$a -vb=$b 'BEGIN{print a+b}'

#awk -va=$a -vb=$b 'BEGIN{print a-b}'

#awk -va=$a -vb=$b 'BEGIN{print a*b}'

#awk -va=$a -vb=$b 'BEGIN{print a/b}'

#awk -va=$a -vb=$b 'BEGIN{print a%b}'

#awk -va=$a -vb=$b 'BEGIN{print a^b}'

~                                                  

~                                                  

~                                                  

~                                                  

"cal.sh" 15L, 434C written       

[root@小马过河 scripts]# sh cal.sh

输入你的游戏帐号:4

输入你的游戏帐号:3

7

1

12

1

1

64

[root@小马过河 scripts]#

[root@小马过河 scripts]# find . -name "machangwei"

[root@小马过河 scripts]# echo $?

0

[root@小马过河 scripts]# cat machangwei

cat: machangwei: No such file or directory

[root@小马过河 scripts]# echo $?

1

3.8 --------------test和[  ] 进行条件判断-----------------

[root@小马过河 scripts]# test -f changwei            

[root@小马过河 scripts]# echo $?

1

[root@小马过河 scripts]# test -f a

[root@小马过河 scripts]# echo $?

0

[root@小马过河 scripts]# [ -d ma ]

[root@小马过河 scripts]# echo $?

1

[root@小马过河 scripts]# mkdir changwei

[root@小马过河 scripts]# [ -d changwei ]

[root@小马过河 scripts]# echo $?

0

3.9 ----&& || 条件判断----------

 [root@小马过河 scripts]# [ -d changwei ]&&echo dir exit

dir exit

            我感觉机子在前一个命令结束之后有一个对返回值的判断

[root@小马过河 scripts]# [ -f sss ]||touch sss

[root@小马过河 scripts]# ls

1.t  a  cal.sh  cal.sh.bak  changwei  date.sh  html.sh  ip.sh  sss  tar.sh

[root@小马过河 scripts]# [ -d xiaoma ]&&echo dir exit

[root@小马过河 scripts]#

3.10 ------------如果----

如果文件不存在就干啥,如果文件存在就不干啥了

3.11 -----------if条件判断-------

[root@小马过河 scripts]# sh if.sh

[root@小马过河 scripts]# ll maxiaowei

total 0

[root@小马过河 scripts]# cat if.sh

#!/bin/bash

if [ -d maxiaowei ];

   then

        echo maxiaowei exit

   else

       mkdir maxiaowei

fi

[root@小马过河 scripts]#

3.12 -------------- 参数个数判断-------------

"canshu.sh" 10L, 135C written    

[root@小马过河 scripts]# sh canshu.sh 2 3

5

[root@小马过河 scripts]# sh canshu 2

sh: canshu: No such file or directory

[root@小马过河 scripts]# sh canshu.sh 2 3

5

[root@小马过河 scripts]# sh canshu.sh  2

canshu wei 2

[root@小马过河 scripts]# cat canshu.sh

#!/bin/bash

a=$1

b=$2

if [  $# -ne 2 ];

   then

     echo  canshu wei 2

     exit

   else

    awk -va=$a -vb=$b 'BEGIN{print a+b}'

fi

[root@小马过河 scripts]#

[root@小马过河 scripts]# sh canshu.yuan 4 3

7

1

12

1.33333

1

[root@小马过河 scripts]# sh canshu.yuan 4

canshu wei 2

[root@小马过河 scripts]# cat anshu.yuan

cat: anshu.yuan: No such file or directory

[root@小马过河 scripts]# cat canshu.yuan

#!/bin/bash

a=$1

b=$2

if [  $# -ne 2 ];

   then

     echo  canshu wei 2

     exit

   else

    awk -va=$a -vb=$b 'BEGIN{print a+b}'

    awk -va=$a -vb=$b 'BEGIN{print a-b}'

    awk -va=$a -vb=$b 'BEGIN{print a*b}'

    awk -va=$a -vb=$b 'BEGIN{print a/b}'

    awk -va=$a -vb=$b 'BEGIN{print a%b}'

fi

[root@小马过河 scripts]#

高超的脚本:

[root@小马过河 scripts]# sh gaochao.sh

命令错误 请输入两个数字

[root@小马过河 scripts]# sh gaochao.sh 4 5

I love you 开始输出结果

 

相加结果

9

相减结果

-1

相乘结果

20

相除结果

0.8

[root@小马过河 scripts]# cat gaochao.sh

#!/bin/bash

num=$#

if [ "$num" -ne "2" ] ; then

       echo "命令错误 请输入两个数字"

       exit 1

else

       echo -e "I love you 开始输出结果 "

fi

 

a=$1

b=$2

       echo "相加结果"

awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1+num2}'

       echo "相减结果"

awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1-num2}'

       echo "相乘结果"

awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1*num2}'

       echo "相除结果"

awk -vnum1=$1 -vnum2=$2 'BEGIN{print num1/num2}'

 

[root@小马过河 scripts]#

结合一下 read

结合函数

3.13 ------------for循环-------

多个变量就循环

for n in xx

do

done

定义变量在哪,

对每一个变量值循环操作

[root@小马过河 scripts]# vim wenjian.sh

#!/bin/bash

for hd in {01..20}

do

  date -s "201705$hd"

  touch /tmp/taojin-$(date +%F).txt

done

for hd in 2017-05-{01..20}
do
date -s $hd
filename=$(date +%F)
touch $filename".txt"
done

3.14 ------------chkconfig优化开机自启动服务的脚本-----

a=里面的命令放在命令行执行要|bash,在这里不需要应该是因为它在脚本里,执行脚本时就已经使用执行命令了

[root@小马过河 scripts]# cat youhuakaiji.sh

#!/bin/bash

a=`chkconfig|sed -nr '/sshd|network|cron|sysstat|rsyslog/!s#(.*)0:.*#1#gp'`

for machangwei in $a

do

  chkconfig $machangwei off

done

[root@小马过河 scripts]#

同学的脚本

#!/bin/bash
for n in $(chkconfig|sed -r '/sshd|network|crond|sysstat|rsyslog/d'|sed -r 's#^(.*)0:.*$#1#g')
do
   chkconfig  $n off
done 

3.15 ------------出错暂时无法解决的脚本--------

问题:有read命令,但是无法使后面的计算得到执行

思路拓展:是否需要有个对输入是数字的判断呢

[root@小马过河 scripts]# vim canshu.sh

#!/bin/bash

read -p "请输入两个数字:" a

read -p "请输入两个数字:" b

a=$1

b=$2

if [  $# -ne 1 ];

   then

     echo 警告:应输入两个数字!!

     exit

   else

    awk -va=$a -vb=$b 'BEGIN{print a+b}'

    awk -va=$a -vb=$b 'BEGIN{print a-b}'

    awk -va=$a -vb=$b 'BEGIN{print a*b}'

    awk -va=$a -vb=$b 'BEGIN{print a/b}'

    awk -va=$a -vb=$b 'BEGIN{print a%b}'

fi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      

[root@小马过河 scripts]# sh canshu.sh

请输入两个数字:1 3

请输入两个数字:3

警告:应输入两个数字!!

[root@小马过河 scripts]# sh canshu.sh

请输入两个数字:1

请输入两个数字:3

警告:应输入两个数字!

3.16 ------------应该再来一个对是否是数字的判断-----

[root@小马过河 scripts]# sh canshu.sh # # # # # # # #

警告:应输入两个数字!!

[root@小马过河 scripts]# sh canshu.sh nishi shui?

0

0

0

awk: fatal: division by zero attempted

awk: fatal: division by zero attempted in `%'

3.17 ------------查看脚本执行的状况- sh -x  ---------

计算器加上判断参数个数,扩展判断这两个参数是否为数字。

课后练习题:批量创建用户并设置随机密码

第4章 **************awk*******

------------awk--------

4.1 ------awk执行流程图

4.2 -----------awk数组结构--------

4.3 ------awk执行过程表---------

取列计算(统计)

条件行(可用行列),哪列,

awk 内置变量  指定分隔符FS,指定输出分隔符OFS,最后一列NF,倒数第几列$(NF-n),只要哪列可以最好以这列前后作为分隔符 多个相同字符加+(+正则表达),指定行分隔符RS,支持正则表达式,

可加字符""

算多少行,'{i++}END print i'

算每行数量相加 '{i=i+$0($1)}END print i'

   取哪列 $数字,$0所有列就是全行内容

   像平面直角坐标系,找列^$

替换sed好

计算awk

!可放在~前

mkdir -p /server/files/
cat >>/server/files/reg.txt <<EOF
Zhang Dandan    41117397   :250:100:175
Zhang Xiaoyu    390320151  :155:90:201
Meng  Feixue    80042789   :250:60:50
Wu    Waiwai    70271111   :250:80:75
Liu   Bingbing  41117483   :250:100:175
Wang  Xiaoai    3515064655 :50:95:135
Zi    Gege      1986787350 :250:168:200
Li    Youjiu    918391635  :175:75:300
Lao   Nanhai    918391635  :250:100:175
EOF

m 第一列是姓氏
m 第二列是名字
m 第一第二列合起来就是姓名
m 第三列是对应的ID号码
m 最后三列是三次捐款数量

4.4 ---------awk分隔符哪行哪列--------

条件:

模糊找行

找列有模糊条件的行

[root@小马过河 ~]# awk '$2~/waiwai/' /server/files/reg.txt

[root@小马过河 ~]# awk '$2~/X/' /server/files/reg.txt

Zhang Xiaoyu    390320151  :155:90:201

Wang  Xiaoai    3515064655 :50:95:135

Zhang Xiaoyu    390320151  :155:90:201

Wang  Xiaoai    3515064655 :50:95:135

4.5 --------awk题----------

1显示Xiaoyu的姓氏和ID号码
2显示所有ID号码最后一位数字是1或5的人的全名
3姓氏是Zhang的人,显示他的第二次捐款金额及她的名字
4显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135 

1

[root@小马过河 files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

Zhang 390320151

Zhang 390320151

2.

方法一:

[root@小马过河 files]# awk '$3~/(1|5)$/{print $1$2,$3}' reg.txt

ZhangXiaoyu 390320151

WuWaiwai 70271111

WangXiaoai 3515064655

方法二:

[root@小马过河 files]# awk '$3~/[15]$/{print $1$2,$3}' reg.txt

ZhangXiaoyu 390320151

WuWaiwai 70271111

WangXiaoai 3515064655

3.

[root@小马过河 files]# awk -F "[ :]+" '$1~/Zhang/{print $(NF-1),$2}' reg.txt

100 Dandan

90 Xiaoyu

100 Dandan

90 Xiaoyu

[root@小马过河 files]# echo 12312312|tr "123" "abc"

abcabcab

4.

[root@小马过河 files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $2,$NF}' reg.txt

Xiaoyu $155$90$201

4.6 -----------awk替换------------

[root@小马过河 files]# awk '{gsub(/:/,"$",$NF);print $0}' reg.txt

Zhang Dandan 41117397 $250$100$175

Zhang Xiaoyu 390320151 $155$90$201

Meng Feixue 80042789 $250$60$50

~  !~

判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字

[root@小马过河 files]# awk -F ":" '$NF!~/nologin$/{print $1}' /etc/passwd

root

sync

shutdown

[root@oldboyedu-40 files]# awk '{gsub(/:/,"$",$NF) ; print $0}' reg.txt |column -t
Zhang  Dandan    41117397    $250$100$175
Zhang  Xiaoyu    390320151   $155$90$201

 

awk读取之前就执行

4.7 ----企业案例3:统计/etc/services文件里面的空行数量---

不用end显示过程

用途:可以统计行数  

[root@小马过河 files]# awk '/^$/' /etc/services |wc -l

16

[root@小马过河 files]# awk '/^$/' /etc/services |uniq -c

     16

[root@小马过河 files]# awk '/^$/{i++} ; END{print i}' /etc/services

16

[root@小马过河 files]# awk '/^$/{++i} ; END{print i}' /etc/services

16

[root@小马过河 files]# awk '/^$/{i++} ; END{print i}' /etc/services

16

[root@小马过河 files]# awk '/^$/{i=i+1} ; END{print i}' /etc/services

16

用途: 可以对一列内容进行累加

seq 10 >num.txt 计算这个文件每一行数字相加的结果 

i=i+$0 ===累积相加 累加

[root@oldboyedu-40 files]# awk '{i=i+$0;print i}' num.txt 
1
3
6
10
15
21
28
36
45
55
[root@oldboyedu-40 files]# awk '{i=i+$0}END{print i}' num.txt 
55

[root@小马过河 files]# awk '{i=i+$0};END {print i}' num.txt

5050

[root@小马过河 files]# awk '{i=i+$1};END {print i}' num.txt

5050

算多少行,'{i++}END print i'

算每行数量相加 '{i=i+$0($1)}END print i'

               '{hotel[$2]++;END print hotel["www"]}'

        hotel[]数组,$2为awk找到的第二列内容,将它放进hotel数组作为变量,++为将数组里面的相同变量进行统计,然后统计结果作为变量值。

4.8 --------awk 数组-----------

  '{hotel[$2]++;END print hotel["www"]}'

  '{hotel[$2]++}END {for (ma in hotel) print ma,hotel[ma]}'

{hotel[$2]++}:hotel[]数组,$2为awk找到的第二列内容,将它放进hotel数组作为变量,++为将数组里面的相同变量进行统计,然后统计结果作为变量值。

END:         没有的话就会显示awk命令执行过程

for (ma in hotel):  定义变量ma 在数组hotel里

print ma,hotel[ma] :  打印变量ma,以及变量值

用途:(简化:计算列重复值)

对ip地址去重并统计重复数

    即对一列重复的内容去重并统计重复数.

[root@小马过河 files]# awk -F "[/]+" '{hao[$2]++}END{for (ma in hao)print hao[ma],ma}' 1

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

定义数组,定义变量为数组元素,打印变量名及变量值

[root@小马过河 files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";

 print hotel[110],hotel[119],hotel[121]}'

lidao tanjiaoshou taojin

[root@小马过河 files]#

4.9 -------企业面试题1:统计域名访问次数----
处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

方法一:

[root@小马过河 files]# cat 1

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

http://post.etiantian.org/index.html

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

[root@小马过河 files]# awk -F "[/]+" '{print $2}' 1|sort|uniq -c|sort -r

      3 www.etiantian.org

      2 post.etiantian.org

      1 mp3.etiantian.org

方法二:

[root@小马过河 files]# awk -F "[/]+" '{hao[$2]++}END{for (ma in hao)print hao[ma],ma}' 1

1 mp3.etiantian.org

2 post.etiantian.org

3 www.etiantian.org

4.10 ---------awk统计的课后题-------

echo  ;echo 可以不换行输出吗?

课后题目:

#secure.zip access.zip

1.统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)

2.统计access.log文件中对ip地址去重并统计重复数

3.统计access.log文件中网站一共使用了多少流量

4.统计access.log文件中每个ip地址使用了多少流量

  1. awk统计有失败的ip并计算个数

[root@小马过河 machangwei]# awk '$6~/Failed/{heike[$(NF-3)]++}END{for(ip in heike) print heike[ip]"      "ip }' secure-20161219|sort -nr

68652      218.65.30.25

34326      218.65.30.53

21201      218.87.109.154

18065      112.85.42.103

17164      112.85.42.99

17163      218.87.109.151

17163      218.87.109.150

2

[root@小马过河 machangwei]# awk '{print $1}' access.log|sort|uniq -c|sort -nr|head

  12049 58.220.223.62

  10856 112.64.171.98

   1982 114.83.184.139

   1662 117.136.66.10

   1318 115.29.245.13

    961 223.104.5.197

    957 116.216.0.60

    939 180.111.48.14

    871 223.104.5.202

    869 223.104.4.139

3.

方法一:

[root@小马过河 machangwei]# awk '{i=i+$10}END{print i}' access.log

2478496663

方法二:

[root@小马过河 machangwei]# sh tt

2478496663

[root@小马过河 machangwei]# cat tt

#!/bin/bash

awk '{a[$1]++}{for (b in a)print b}' access.log >/machangwei/xiaoma

for i in 'cat /machangwei/xiaoma'

do

awk -v i="BASH"  '/i/{d=d+$10}END{print d}' /machangwei/access.log

done

4.

[root@小马过河 machangwei]# awk '{a[$1]=a[$1]+$10}{for(b in a)print b,a[b]}' access.log |head

101.226.61.184 24662

101.226.61.184 25188

101.226.61.184 25188

27.154.190.158 3084

101.226.61.184 32579

27.154.190.158 3084

101.226.61.184 32579

27.154.190.158 3084

114.94.29.165 491

101.226.61.184 44091

[root@小马过河 machangwei]# seq 20|sort

1

10

11

12

13

14

15

16

17

18

19

2

20

3

4

5

6

7

8

9

[root@小马过河 machangwei]# seq 20|sort -nr

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

4.11 ----------awk识别花括号加条件----

awk --posix '/[0-9]{1,5}/' secure-20161219

 awk --re-interval '/[0-9]{1,5}/' secure-20161219

假如现在有个文本,格式如下:

a  1

b  3

c  2

d  7

b  5

a  3

g  2

f  6

d  9

即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:

即将相同的字母后面的数字加在一起,按字母的顺序输出。

 

a  4

b  8

c  2

d  16

f  6

g  2

4.12 ----- a[$1]=a[$1]+$2-----

功能:某一列变化的有重复的内容对应另一列变化的数,将这个同一个东西的对应值累加并将两者对应打印出来

[root@小马过河 machangwei]# awk '{a[$1]=a[$1]+$2}END{for (b in a)print a[b],b }' cc

4 a

8 b

2 c

16 d

6 f

2 g

awk '{a[$1]=a[$1]+$2}END{for (b in a)print a[b],b }' cc

{a[$1]=a[$1]+$2: 数组中很多变量,$1中第i个变量加上$2赋值给后一个第i个变量,实现第i个变量对应的$2的统计和,然后将统计和作为变量i的值

for (b in a) :     定义变量在数组a里

print a[b],b :     打印变量值,变量

4.13 5. ip出现次数及使用流量

[root@oldboyedu-40 files]# awk '{count[$1]++;sum[$1]+=$10}END{for(pol in count)print pol,count[pol],sum[pol]}' access.log |column -t|sort -rnk3 |head 
114.83.184.139   1982   31362956
117.136.66.10    1662   22431302
116.216.30.47    506    21466000

[root@oldboyedu-40-nb files]# awk 'BEGIN{print "访问次数","使用流量","ip地址"}{ss[$1]++;mm[$1]+=$10}END{for(nn in mm)print ss[nn],mm[nn],nn}' access.log |sort -n|column -t|head

访问次数  使用流量  ip地址

1         0         101.226.65.105

1         0         110.75.105.135

1         0         110.75.105.47

1         0         110.75.87.144

[root@小马过河 machangwei]# awk '{ips[$1]++;sum[$1]+=$10}{for(b in ips)print b,ips[b],sum[b]}' access.log |head

101.226.61.184 1 24662

101.226.61.184 2 25188

[root@files]# awk '{sums[$1]+=$10;sus[$1]++}END{for (sum in sums) print " 访问ip===> " sum " ip访问次数=====> " sus[sum] " 每次访问的流量 "sums[sum]/sus[sum]/1024"K"  " 总流量: "sums[sum]}' access.log |sort -nrk6 | head |column -t

访问ip===>  182.18.102.159   ip访问次数=====>  3   每次访问的流量  242.575K  总流量:  745189

访问ip===>  180.97.182.222   ip访问次数=====>  1   每次访问的流量  185.885K  总流量:  190346

访问ip===>  124.156.66.72    ip访问次数=====>  2   每次访问的流量  185.791K  总流量:  380500

访问ip===>  223.104.211.140  ip访问次数=====>  2   每次访问的流量  130.531K  总流量:  267327

访问ip===>  101.86.13.161    ip访问次数=====>  17  每次访问的流量  97.4069K  总流量:  1695660

访问ip===>  101.87.174.78    ip访问次数=====>  42  每次访问的流量  95.2861K  总流量:  4098063

访问ip===>  202.111.6.229    ip访问次数=====>  3   每次访问的流量  95.2354K  总流量:  292563

访问ip===>  61.171.38.1      ip访问次数=====>  74  每次访问的流量  92.072K   总流量:  6976851

访问ip===>  66.249.82.181    ip访问次数=====>  3   每次访问的流量  84.0768K  总流量:  258284

访问ip===>  125.86.90.242    ip访问次数=====>  19  每次访问的流量  82.5421K  总流量:  1605939

效果图

不用两个for就是这样,不好放在一起

4.14 ------awk 中的begin----------

可以|""里里面加内容,先begin,再中间,再end,如果|加在整个命令前面,begin里的内容也会加入,比如排序

[root@oldboyedu-40 files]# awk 'BEGIN{print "ip","count"}{count[$1]++}END{for(pol in count)print pol,count[pol]|"sort -rnk2"}' access.log  |head |column -t 
ip              count
58.220.223.62   12049
112.64.171.98   10856
114.83.184.139  1982
117.136.66.10   1662
115.29.245.13   1318
223.104.5.197   961
116.216.0.60    957
180.111.48.14   939
223.104.5.202   871

4.15 ------------awk版本4以上有替换功能-----

[root@小马过河 machangwei]# awk --version

GNU Awk 3.1.7

Copyright (C) 1989, 1991-2009 Free Software Foundation.

 

This program is free software; you can redistribute it and/or modify

it under the terms of the GNU General Public License as published by

the Free Software Foundation; either version 3 of the License, or

(at your option) any later version.

 

This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

GNU General Public License for more details.

 

You should have received a copy of the GNU General Public License

along with this program. If not, see http://www.gnu.org/licenses/.

第5章 ---------总结大集合-----

cpu一个内核同时只能做一个事情,我们看到他做很多事是因为它不断切换的。比如一个人做会这件事,做会儿那件事,把做事时间无限缩短,相当于同时在做很多事情。

reinstall

5.1 -------查看端口总结  踢死了妮妮(tslnn)-------

查看端口是否开启五个:踢死了妮妮(tslnn),telnet,ss(netstat),lsof,nmap,nc

查看22端口是否开启  
1.telnet 
telnet 10.0.0.200 22 
2.ss 
ss -lntup|grep 22 
ss === netstat 
3.lsof 
lsof -i:22 
4.nmap 
[root@oldboyedu-40 files]# nmap -p22 10.0.0.200
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
[root@oldboyedu-40 files]# nmap -p25 10.0.0.200
PORT   STATE  SERVICE
25/tcp closed smtp

Nmap done: 1 IP address (1 host up) scanned in 2.61 seconds

5.
[root@oldboyedu-40 files]# nc 10.0.0.200 22
SSH-2.0-OpenSSH_5.3

Protocol mismatch.



ps -ef |grep sshd #进程是否在运行


yum install telnet tree lrzsz  nmap nc  dos2unix -y

5.2 ----------- 排查无法上网总结  3p-----

2)linux无法上网
   1]  ping  www.baidu.com 

 #是否能上网
   2]  ping  223.5.5.5 

     #DNS是否有问题
   3]  ping 网关          #
    

--------查看系统默认网关
route -n  =====      

ifconfig 
ip a 
ifconfig eth0 
ip a s eth0 
ip address show eth0

route -n
ip route
ip r

5.3 --------------  vi/vim快捷方式总结----

vi/vim快捷方式

    移动光标:

           快速的达到文件的最后一行 G(shift+g)

           快速达到文件的第一行     gg

           快速达到文件的第100行 100gg     :100

        移动光标到行首       0 ^

        移动光标到行尾       $

       

    编辑:

        复制                               yy

        粘贴                               p

        剪切/删除当前行                    dd

        删除光标所在位置到文件的最后一行   dG

        删除光标所在位置到行尾             D   === d$ 

        把光标移动到文件的结尾并进入编辑模式   A

        在当前行下面插入一个空行并进入编辑模式 o(小写字母O)

        删除光标所在位置的一个字符         x

        撤销                               u

       

       

    查找替换:

    :1,10s#oldboy#oldgirl#g

    :.,$s#oldboy#oldgirl#g    #.表示当前行

    :%s#oldboy#oldgirl#g      #1,$====%

        查找替换移动:

    :1,10s#oldboy#oldgirl#g

    :.,$s#oldboy#oldgirl#g    #.表示当前行

    :%s#oldboy#oldgirl#g      #1,$====%

    :1,5m[ove]10              #从第一行到底5行移动到第10行

    :1,5co[py]10              #从第一行到底5行复制到第10行

    批量操作:(可视块模式)

    ctrl+v

    ctrl+v 按I 编辑  按esc

   

    其他:

    /搜索的内容   继续搜索n    继续向上搜索N   

      显示行号     :set nu

      取消显示行号 :set nonu

s

5.4 ---sed总结--------

1.sed '找谁干啥'

删改查

d s p

5.5 ------awk总结---------

3.awk '找谁{干啥}'

NR==1

NR==1,NR==20

正则表达式

/oldboy/

$2~/oldboy/

NR>=20

$3>20

print

gsub(/找谁/,"替换为什么",在哪个部分)

计算

i=i+1   i++

i=i+$2  i+=$2

h[$1]=h[$1]+1   h[$1]++

h[$1]=h[$1]+$2  h[$1]+=$2

[root@oldboyedu-40 files]# awk 'BEGIN{for(i=1;i<=100;i++) sum=sum+i;print sum}'

5050

2.shell

变量分类

read

循环和判断

5.6 ------rename-----

[root@小马过河 ~]# rename bb "cc" bb

[root@小马过河 ~]# ls

1.txt            c     d035      ett.txt  install.log         lrzsz-0.12.20.tar.gz  passwd.txt  stu.sh

2.txt            cc    data      f032     install.log.syslog  ma                    person.txt  tandao

anaconda-ks.cfg  d032  download  f035     lrzsz-0.12.20       machangwei            services    x.t

[root@小马过河 ~]# rename x "e" *.t

[root@小马过河 ~]# ls

1.txt            c     d035      e.t      f035                lrzsz-0.12.20         machangwei  services

2.txt            cc    data      ett.txt  install.log         lrzsz-0.12.20.tar.gz  passwd.txt  stu.sh

anaconda-ks.cfg  d032  download  f032     install.log.syslog  ma                    person.txt  tandao

别人给的一道题:第三行求和

[root@db01 ma]# vim ma.txt 
sojfopsjfpsj
sfjpsjpf
3432

方法一:

[root@db01 ma]# sed -n "3s#.#&
#gp" ma.txt|awk '{i=i+$0}END{print i}' 
12

  

方法二:

[root@db01 ma]# vim 3.sh 
sum=0
shu=`awk NR==3  ma.txt|wc -L`
for i in `seq 1 $shu`
do
    j=` awk NR==3  ma.txt|cut -c $i`
    let sum=sum+j
done
echo $sum

  

                                          

原文地址:https://www.cnblogs.com/machangwei-8/p/8475510.html