sed复制剪切功能与awk

来源:互联网 发布:企业 大数据战略 编辑:程序博客网 时间:2024/05/16 15:45

模式空间 存储sed处理的行
不存储行
被sed 拷贝模式空间里行,被动作处理完后会,自动输出

保持空间 默认只存储一个换行符号 \n
存放在保持空间的行,不会被sed处理
也不会输出
只有存储数据的功能

模式空间 —— > 保持空间
h 覆盖
H 追加
保持空间 ——- > 模式空间
g 覆盖
G 追加

1h
Gddddddddddddddddaaaaaaaaaaaaaaaaaasedsed1h;2H;G’ a.txt

sed剪切 把文件中的第一行和第二行剪切到文件的末尾
sed ‘1h;2H;1,2d;$G’ a.txt

1d
1,3d
1d;3d;5d
/[0-9]/d

执行动作时条件的其他表示方式
/正则表达式/,/正则表达式/动作
/正则表达式/,num动作

sed ‘1,3d’ a.txt

sed ‘1,/sync/d’ a.txt

sed ‘/bin/,5d’ a.txt当起始位置为正则表达式时,无视结束为止,乱删除,难以控制

sed ‘/a/,/w/d’ a.txt

11111111111111111
xxxxxxxxxxxxxxxxx
aaaaa
11111111111
88888888888
wwwwwwwwwww
11111111111111111
xxxxxxxxxxxxxxxxx
aaaaa
11111111111
88888888888

n,+m动作 从第n行开始删,再删m行
$2,+4d

[root@sql-20 ~]# cat del2lines.sh#!/bin/bashsum_lines=`cat $1 | wc  -l`s_line=`expr $sum_lines - 1`sed -i ''$s_line',+1d' $1    #引用变量要使用单引号

n~m动作 读够m行 删除读进来的第n行
1~2d

n,~m动作 从第n行开始删,删到行号是数字m的整数倍间的行为止
3,~2d
/v/,~2d

使用awk
awk 是什么 ? 编程语言 (变量 函数 流程控制 数组 语法格式)
单独使用 ,主要用来对数据做统计
1 统计网站服务器当天的访问量
2 当天9:00~12:00访问量
3 把当前系统1小时内,cpu使用率最高前5进程 的进程名输出
用在shell脚本里,使用awk获取数据给shell程序处理
[root@sql-20 ~]# which awk
/usr/bin/awk
[root@sql-20 ~]# rpm -q gawk
gawk-3.1.7-10.el6.x86_64
[root@sql-20 ~]#

awk用法
awk ‘{动作}’ 文件列表
命令 | awk ‘{动作}’

awk 【选项】 ‘条件{动作}’ 文件列表
命令 | awk 【选项】 ‘条件{动作}’

awk如何处理数据?
以行为处理单位 逐行处理 一次处理一行 处理完当前行自动处理下一行
默认把处理结果输出的屏幕上

awk 变量 (自定义变量 、 内置变量 、 使用shell变量(自定义、环境变量))

awk自定义变量 : 变量名=值
变量名

awk ‘{ sex=”gril” ; print sex }’ a.txt
awk ‘{ sex=”gril” ; print “she is “sex }’ a.txt
awk ‘{ age=23 ; print age }’ a.txt

选项
-F 设置字段分隔符 head -2 /etc/passwd | awk -F “:” ‘{print 1"\t",7}’

内置变量
0FILENAMENRFNRNF使FS\tabFS=:1 保存使用分隔符 分割后 ,对应列(域)的值 (第一列的值)
23
$N

ENVIRON 数组类型内置变量
系统环境变量名:
awk ‘{print ENVIRON[“USER”]}’ a.txt使用索引数组调用系统变量
awk执行过程中调用shell变量:
name=jim age=10
awk -v x=namevy=age ‘{print x,y}’ a.txt

[root@sql-20 ~]# echo HOSTNAMEUSER
pc205.tarena.com root
[root@sql-20 ~]# awk -v x=HOSTNAMEvy=USER ‘{print x,y}’ a.txt调用shell变量时,需要通过接口调用
pc205.tarena.com root
pc205.tarena.com root

三 、 awk 执行顺序
BEGIN{ 处理动作 } 行前处理 awk没有读入行之前执行的处理
作用:对数据做初始化

awk  'BEGIN{FS=":"}{print $1}' /etc/passwdhead -3  /etc/passwd | awk '{i=0;i++;print i}'head -3  /etc/passwd | awk 'BEGIN{i=0}{i++;print i}'head -3  /etc/passwd | awk 'BEGIN{i=0}{i++}END{print i}'

{ 处理动作 } 行处理 awk 读入行之后执行的处理
作用:对读入的行做处理
多个处理动作使用; 间隔
{i++;print 0,1}
END{ 处理动作 }行后处理 awk 读完所有行之后执行的处理
作用 : 做总结性输出
user shell
root /bin/bash
bin /bin/bash
daemon /bin/bash

head -3 /etc/passwd | awk -F “:” ‘BEGIN{print “user\tshell”}{print 1"\t",7}’
head -3 /etc/passwd | awk -F “:” ‘{print 1"\t",7}’ | sed ‘1iuser shell’

awk 算数运算符:
+ - * / %
++ –
+= -= *= /=
awk ‘BEGIN{print 1+1}’
awk ‘BEGIN{print 1*1}’
awk ‘BEGIN{print 1/1}’
awk ‘BEGIN{print 1%1}’
awk ‘BEGIN{print i%j}’
awk ‘BEGIN{i=10;j=2;print i%j}’
awk ‘BEGIN{i=10;i++;print i}’
awk ‘BEGIN{i=10;i++;print i;i++}’
awk ‘BEGIN{i=10;i++;print i;i++;print i}’
awk ‘BEGIN{i=10;i++;i++;print i}’
awk ‘BEGIN{i=10;i+=3;print i}’
awk ‘BEGIN{i=10;i+=3;i+=3print i}’
awk ‘BEGIN{i=10;i+=3;i+=3;print i}’
awk ‘BEGIN{i=0}{i++}END{print “system user is “i}’ /etc/passwd
awk ‘BEGIN{i=0}{i++}END{print “system user is “i}’ /etc/passwd

四、awk的处理条件

awk 选项 ‘条件{处理动作}’ 文件名

条件表示方式
数值比较 num1 比较符 num2

等于 不等于 大于 大于等于 小于 小于等于
== != > >= < <=

awk -F “:” ‘{x++}3<500i++3>=500{j++}END{print “sum user “x;print “outside user “j;print” inside user “i}’ /etc/passwd

awk -F “:” ‘{ }{ }{ }END{ }’ /etc/passwd

字符比较
“string1” 比较符 “string2”

等于 不等于
== !=

awk  -F ":"  '$7!="/sbin/nologin"{print $0}'  /etc/passwdawk  -F ":"  '$1=="root"{print $0}'  /etc/passwd

正则表达式匹配
值 比较符 /正则表达式/

匹配 ~
不匹配 !~

awk -F “:” ‘1 /[09]/print$1/etc/passwdawk0 !~ /root/{print $0}’ /etc/passwd

逻辑比较 (多个判断条件时,使用逻辑比较)
逻辑与 && 多个条件必须同时成立 条件1 && 条件2 && 条件3
逻辑或 || 多个条件某一个条件成立就可以 条件1 || 条件2 || 条件3

逻辑非 ! 取反
== ~
!= !~
[root@sql-20 ~]# awk -F “:” ‘1=="root" &&3==30 && 7=="/bin/bash"{print1,3,7}’ /etc/passwd
[root@sql-20 ~]#

[root@sql-20 ~]# awk -F “:” ‘1=="root" &&3==0 && 7=="/bin/bash"{print1,3,7}’ /etc/passwd
[root@sql-20 ~]#

awk -F “:” ‘1=="root"||1==”daemon” || 1=="bin"{print0}’ /etc/passwd

五、awk数组
定义数组
数组名[下标]=值 ip[2]=100;ip[1]=200
数组名[“下标”]=”值” tea[“tea1”]=”jim”

使用数组元素 : 数组名[下标]

输出数组元素的值 : print 数组名[下标]

awk ‘BEGIN{student[“name”]=”jim”;student[“sex”]=”girl”;print student[“sex”]}’
awk ‘BEGIN{grupnum[3]=1020;print grupnum[3]}’

[root@sql-20 ~]# awk ‘BEGIN{grupnum[3]=1020;print grupnum[0],grupnum[3]}’

head -3 /etc/passwd | awk -F “:” ‘{sysuser[3]=1}END{print sysuser[1]}’

head -3 /etc/passwd | awk -F “:” ‘{sysuser[3]=1}END{print sysuser[1]}’

1
统计 a.txt 文件 相同用户名出现的次数
[root@sql-20 ~]# grep bin a.txt –color
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash

root 3 i
bin 4 j
daemon 3 x

awk ‘BEGIN{FS=”:”;i=0;j=0;x=0}1=="root"i++1==”bin”{j++}1==daemonx++ENDprinti,j,xa.txthead1b.txt|awki++i=i+1
数组名[下标]=值

数组名[下标]++
user[3]=10

head -1 b.txt | awk ‘{usergrp[“name”]++}’
usergrp[“name”]=usergrp[“name”]+1

2、备份数据库服务器上每天新生成的binlog日志(备份过的不备份),备份时,不备份正在使用binlog日志, 备份的binlog日志存放的/baklogdir目录里,备份binlog 日志 和名不变。

vim  newbakbinlog.sh#!/bin/bashdatadir=/var/lib/mysqlbakdir=/baklogdirif  [  ! -e  $bakdir  ];then     mkdir  $bakdirfifor  file   in  `sed  '$d'  $datadir/plj.index`do      binlogname=`echo  $file  |  awk  -F "/"  '{print $2}'`      if  [   !  -e $bakdir/$binlogname ];then           cd  $datadir           cp $binlogname    $bakdir/      fidone00  18   *   *    *   newbakbinlog.sh

3统计系统内建用户数 统计系统外建用户数
统计不能登录系统的用户数

awk  -F   '$7=="/sbin/nologin" { i++ }END{print  i}'   /etc/passwd

输出文件中的偶数行 输出文件中的奇数行

awk    'FNR%2==0{print  FNR,$0}'   a.txt

输出数字57到93之间 有7或是7的整数倍的数。

seq  57  93    |   awk  '$0  ~ /7/  ||   $0%7==0  {print   $0}'

awk -F “:” ‘{user[$1]++}END{print user[“tom”]}’ b.txt

统计 a.txt 文件 相同用户名出现的次数
[root@sql-20 ~]# grep bin a.txt –color
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash

六 、awk流程控制
循环结构 for while do…while

for(赋初值;条件 ; 步长){ 循环体 }

awk ‘BEGIN{ for(i=1;i<=5;i++){print i} }’
awk ‘BEGIN{ for(i=1;i<=5;i++){ipgrp[i]=”jim”i} }’
awk ‘BEGIN{ for(i=1;i<=5;i++){ipgrp[i]=”jim”i} ; for(i=1;i<=5;i++){print ipgrp[i]} }’

遍历数组的for循环结构
for( 变量名 in 数组名){ 循环体 }随机赋值

usergrp[1]=”jim”;usergrp[2]=”tom”;usergrp[3]=”lucy”

awk ‘BEGIN{usergrp[1]=”jim”;usergrp[2]=”tom”;usergrp[3]=”lucy”; for(i in usergrp){print i} }’

awk ‘BEGIN{ for(i=1;i<=10;i++){usergrp[i]=”jim”i} ; for( j in usergrp){print j} }

awk -F “:” ‘{user[$1]++}END{ for( i in user){ print i,user[i]} }’ b.txt

while循环

while (条件){ 循环体 }

awk ‘BEGIN{ i=1 ;while( i <=5 ){ print i ;i++ } }’

awk ‘BEGIN{ i=1 ; while( i <=5 ){ipgrp[i]=”192.168.1.”i ;i++} }’

awk ‘BEGIN{ i=1 ; while( i <=5 ){ipgrp[i]=”192.168.1.”i ;i++} ; for( x in ipgrp){print ipgrp[x] } }’

do…while循环 (先执行循环体 再判断条件)

do{ 循环体 }while(条件)

awk ‘BEGIN{ i=1 ; while( i <=0 ){ print i ; i++ } }’
awk ‘BEGIN{ i=1 ; do { print i ; i++ }while( i <= 0 ) }’

选择结构 if
if(条件){ …… }
awk -F “:” ‘{ if(3>=500){   print3," "$0 }}’ /etc/passwd

if(条件){…….}else{…….}
awk -F “:” ‘{ if(3>=500){   print3," "0 }else{ print3} }’ /etc/passwd

if(条件1){…….}elif(条件2){…..}elif(条件N){…..}else{……}

awk -F “:” ‘{ if( 1=="root")print"userisadmin"elseif(3>=500){ print 1," outside user"  }else if(3==0){ print 1,"user is  admin"  }else  if(3 >=1 && $3<500){print “inside user”}else{print “AAAAAAAAAAA”} }’ /etc/passwd

-f 调用文件对数据做处理

vim xxx.awk

!/usr/bin/awk

BEGIN{
FS=”:”;i=0;j=0
}

{
if( $1==”root” ){

  print "user is  admin"}else if($3>=500){ print $1," outside user"

}else if( $3==0){

print $1,"user is  admin"

}else if(3 >=1 &&3<500){

 print "inside user"

}else{
print “AAAAAAAAAAA”
}
}
:wq

awk -f xxx.awk /etc/passwd

awk ‘条件{ }’ /etc/passwd

awk流控函数
控制awk循环结构的执行
break 结束自己所在循环执行
continue 结束自己所在循环的本次循环,并开始下一次循环

[root@sql-20 ~]# awk ‘BEGIN{ for(i=1;i<=5;i++){ print i } }’
1
2
3
4
5
[root@sql-20 ~]# awk ‘BEGIN{ for(i=1;i<=5;i++){ if ( i==3 ){ break } ; print i }}’
1
2
[root@sql-20 ~]# awk ‘BEGIN{ for(i=1;i<=5;i++){ if ( i==3 ){ continue } ; print i} }’
1
2
4
5
[root@sql-20 ~]#

控制awk的执行
next 读取当前行的下一行

awk ‘FNR>=3 && FNR<=7{next}{print FNR,” ” 0}’ b.txt  
awk ‘FNR>=3 || FNR<=7{next}{print FNR,”  ”
0}’ b.txt

exit 终止awk读入行
[root@sql-20 ~]# awk ‘FNR==3{exit}{print 0}’ b.txt  
     1  root:x:0:0:root:/root:/bin/bash  
     2  bin:x:1:1:bin:/bin:/bin/bash  
[root@sql-20 ~]#   
[root@sql-20 ~]# awk ‘FNR==3{exit}{print
0}END{print “over”}’ b.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/bin/bash
over
[root@sql-20 ~]#

awk变量 awk处理顺序 awk处理数据时加条件 awk运算符

awk数组 awk流程控制(if for for…in while do…while)

使用awk文件对数据做处理 awk -f xxx.awk /etc/passwd

awk流程
循环结构执行的控制 break continue
awk读入行的控制 next exit

输出当前系统10秒内,cpu使用率最高的前5个进程的进程名和cpu使用率总和

!/bin/bash

for ((i=1;i<=10;i++))
do
ps -eo comm,pcpu | sed ‘1d’ >> /tmp/cpu2.txt
sleep 1
done

awk ‘{cpu[1]+=2}END{for( comm in cpu ){print comm,” “cpu[comm]} }’ /tmp/cpu2.txt | sort -rnk 2 | head -5

shell 基础 正则表达式 sed awk

expect的使用
Expect是一个免费的编程语言
用来实现自动和交互式任务进行通信,而无需人的干预。通常用在Shell脚本中,获取指定的数据
用非交互的方式实现了所有交互式的功能.

yum -y install expect

spawn 触发交互式操作
expect “捕获什么内容” 捕获命令执行后的输出内容,捕获到想的内容为成功
send “发送的数据” expect捕获数据成功后,发送数据

自动上传文件到ftp服务器的本 (192.168.1.100 /var/ftp/pub目录下)
vim /shell/auto_file_put

!/usr/bin/expect

set ip “192.168.4.20”
set user “ftp”
set password “”
set path [lindex argv0]setfile[lindexargv 1]
spawn ftp 192.168.4.20
expect “:”
send “user\nexpectPassword:sendpassword\n”
expect “ftp>”
send “cd pub\n”
expect “ftp>”
send “lcd path\nexpectftp>sendputfile\n”
expect “ftp>”
send “bye\n”
:wq
chmod +x /shell/auto_file_put

/shell/auto_file_put /tmp homework.txt
/shell/auto_file_put /mysqbak webdb.sql

pxe.sh
LAMP.sh

统计网站服务当天的访问量
把当前系统使用率最高的前10个命令输出并输出使用的总次数

0 0
原创粉丝点击