坚持#第247天~sed和awk进阶

来源:互联网 发布:windows xp翻墙 编辑:程序博客网 时间:2024/06/05 04:56

获取最大值的方法:declare -i MAX=0

[ $RANDOM-gt $MAX ] && MAX=$RANDOM

du是显示目录及该目录里面的文件的大小,-h人性化显示,du -s是显示该目录本身全部的大小

df -i显示inode

df -P显示块

 

sed ‘/^./d’pass.txt先定位到那一行,然后删除掉那行

sed ‘8d;20d’pass.txt删掉所有数字

sed -r ‘s#[[:digit:]]+##g’注意sed -r是支持扩展匹配

dirname 获取文件的绝对路径

sed ‘a\ ’/etc/passwd在每行下面添加一行空白

 

awk计算

基本工资+绩效

 

如果有负数的话,要用cut将负号去掉,它会识别负负得正的:

 

awk可以+-*/%,**就几次方,^呢?^等同于**求几次方,其中/能自动有小数点精度5或6位

 

awk浮点数运算awk运算

printf “%.2f\n”,$1/$2  需要手动换行,浮点数用f,精度用.小数位数

 

 

插入总工资和实发工资:

 

找到以什么开头的那行

注意,awk不支持直接写行号

 

uid>=1000:(>=可以在awk里面直接使用)

 

shell为bash结尾:也叫匹配正则(~/字符串$/)

哇,awk也能支持正则呀,比sed厉害多了

==的用法:

!=的用法:

 

满足多个条件,条件呀:(试一下~不空格行不行,连在一起都行)

 

特殊模式:

awk [option]'BEGIN{动作}定址{动作}END{动作}'  filename ...

BEGIN{}:在读取文件之前就执行,并且只执行一次

定址{}:这一部分有可能做多次

END{}:在处理完文本之后执行,并且只执行一次

BEGIN:一般用于打印表头、初始化分隔符、定义变量等

END:汇总数据  比如:打印总支出金额、总成绩、平均成绩、等等

start:

(总结:awk的内容在单引号里面写,BEGIN写在最前面)

打印以root开头那行的信息:

说明一下列的内容哦:

排版格式:

老师嫌麻烦,不排版了

 

哈哈哈哈:BEGIN是指定在最前面输出,END是指定在最后面输出:

 

FS:字段分隔符,默认是空白,哈哈哈其实就是-F写在BEGIN里面就变成了FS,BEGIN里面有多个的话可以用分号隔开

OFS改变输出的分隔符:

 

打印用户的shell为bash的用户的用户名  uid gid  家目录  信息,并加上表头:

解:(提示:想都不用想先写awk最基本的格式)

awk -F: ‘$7~/bash$/{print$1,$3,$4,$6}’ /etc/passwd(包含)或

awk -F: ‘$7==”/bin/bash”{print$1,$3,$4,$6}’ /etc/passwd或

awk -F: ‘/bash$/{print$1,$3,$4,$6}’ /etc/passwd

添加表头:

awk -F: ‘BEGIN{print“USERNAME UID GID HOME_DIR”}/bash$/{print $1,$3,$4,$6}’ /etc/passwd

格式排版:

awk -F:'BEGIN{printf "%10-s %5-s %5-s%10-s\n","USERNAME","UID","GID","HOME_DIR"}/bash$/{print$1,$3,$4,$6}' /etc/passwd

上面这只是排版好了表头,下面再对表头下面进行排版(可以复制粘贴过去):

awk -F:'BEGIN{printf "%10-s %5-s %5-s%10-s\n","USERNAME","UID","GID","HOME_DIR"}/bash$/{printf"%10-s %5-s %5-s %10-s\n",$1,$3,$4,$6}' /etc/passwd

 

说明:
BEGIN和END能单独使用
1.只有BEGIN,后面不需要加文件
# awk 'BEGIN{print "hello"}'
hello

2.只有END,后面必须接文件,文件可以是空文件,也可以是有内容的文件
# awk 'END{print "hello"}' /etc/passwd
hello
# touch apple.txt
# cat apple.txt
# awk 'END{print "hello"}' apple.txt
hello

 

外面的-F可以写到BEGIN里面变成了FS=”:”(ORS="":自动换行的)

 

与数据相关的变量
NR:记录数,awk所处理的总行数,NR在很多情况下可以看成行号

awk统计行数awk打印行数
# awk 'END{print NR}' /etc/passwd(注意不加END会打印出所有行号)
48
# awk 'END{print NR}' /etc/passwd /etc/shadow
96

两个文件可以接着显示行号:

awk '{print NR,$0}' /etc/passwd /etc/shadow

 

awk打印第5行的内容:

NF是显示有几段

print $NF是打印最后一段的内容

 

打印倒数第2、3、6个值:print $(NF-1)

 

NF字段:若只写NF是一共有多少段,若写$(NF)是打印那段的内容


1.打印passwd文件的奇数行的行号和内容
# awk 'NR%2 != 0{print NR,$0}' /etc/passwd
# awk 'NR%2 == 1{print NR,$0}' /etc/passwd
2.打印倒数第4个字段(gid)/etc/passwd
# awk -F: '{print $(NF-3)}' /etc/passwd

 

自定义变量
命名规则:变量名由数字、字母、下划线构成,不能已数字开头,不要使用关键字,见名知意
给变量赋值
变量名=变量值
变量名="字符串" 一定要用引号引起来
awk 'BEGIN{a=8;b="abc";print a,b}' //不要写$符号来取值
8 abc
-v:用户自定义变量,每个变量之前都必须使用-v作为前缀,自定义变量要在外面去定义-v
awk -v a=4 -v b="abc" 'BEGIN{print a,b}'
4 abc

 

每读一行处理一次,默认开始a=0

0*2=0,全是0

给a赋予初值2,干什么,自己去试试a**=2,先猜结果4,16,在验证:

a++:

++a:

 

打印100以内的能被5整除并且以5结尾的数
seq 100 | awk '$1%5==0&&$1~/5/{print $1}'

 

哈哈,不是一行一行的数字显示就强行换行显示:

 

求平均成绩:

在后面加一行表示平均成绩的输出($0,平均成绩):

利用定义变量的方法:

 

樱桃:注意$1是名字

 

注意$2是80

注意了:

awk'{sum=0;sum+=$2;print $1,$2,sum}' e.txt

awk'BEGIN{sum=0}{sum+=$2;print $1,$2,sum}' e.txt

完全不一样的结果,因为BEGIN可以想成是在外面的全局变量,只执行了一次,而不是BEGIN里面的sum会每次初始化为0

 

这个班的单科语文平均分怎么求?

 

 

过一遍:

第一个:

 

 

第二个:

 

 

第三个:

 

想打印最后一个值

平均数:sum/3

 

打印第一个字段和最后一个字段:(提示$1和$NF)

写入脚本:

vim awk.txt

awk -fawk.txt /etc/passwd

 

注意sed不会对源文件修改,加了-i才会对源文件修改,所以不要使用cat 误认为修改了

 

awk流程控制awk控制语句awk判断语句:

注意在awk控制语句里面就不需要用$来表示变量的值了,直接写变量名就可以了(还真的是跟C语言一模一样)awk系统命令

使用awk执行系统命令
# awk 'BEGIN{print "today is :";system("date")}'不加BEGIN就是读一行执行一行
today is :
2017年 05月 25日 星期四 10:08:13CST

命令之前用分号隔开,感悟:system(“终端命令”)

 

对比(下面是awk的语法):awk问号表达式

条件测试?输出结果1:输出结果2;
# awk 'BEGIN{num1=2;num2=8;num1>num2?max=num1:max=num2;print "max is"max}'  注意要声名新的变量然后再赋值

简写,直接写在print里面:

发现这种直接在print里面并不需要声名新变量并赋值

 

判断用户的uid和gid是否相等,相等输出用户名uid等于gid,不等输出用户名uid和gid不等

简写,直接写在print里面:

发现这种直接在print里面并不需要声名新变量并赋值

 

以r开头的判断它的gid和uid是否相等:

awk -F:'/^r/{print $1,$3,($3==$4?"eq":"ne"),$4}' /etc/passwd

注意判断语句不要用双引号,而要用小括号括起来,然后字符串的话用双引号括起来

 

awk判断语句:(完全变成了C语言)

 

 

如果等于80分,输出good,否则输出bad

jim  80

tom  89

jack 78

awk'{if($2=="80"){print $1,$2,"good"}else{print$1,$2,"bad"}}' e.txt

需要注意的是:awk ‘{直接开始写if}’ e.txt

 

awk循环语句:

打印1~10

 

文件有3行就每读一行处理一次

1~10 1~101~10

 

NR<=3前3行干什么

 

awk的while循环可以直接写a++,干什么

 

 

使用while循环:

格式需要排版

 

awk的for循环(和C语言一样):

打印1~10

注意别忘了shell里面的for循环要for(())

 

输出每行最大值 循环加判断:
cat h.txt
89 45 36 789
45 63 12 98
98 56 66 55
42 87 41 20

awk'{max=0;for(i=1;i<=4;i++){if($i>max){max=$i}}print max}' h.txt

注意不要忘了shell里面[ $i > $max ]这样写格式不对,要这样写:[ $i -gt $max ],而在awk里面不需要给变量值加上$,直接写max就行了

 

使用awk写一个九九乘法表:

awk'BEGIN{for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf"%d*%d=%d\t",j,i,i*j}print ""}}'

 

凡哥作业5:

1.清空/tmp目录内的内容
rm -rf *
2.查看/etc/passwd文件内容,并显示行号。
cat -n /etc/passwd
3.将第2题命令的结果重定向覆盖写入/tmp/pass1文件中。
cat -n /etc/passwd > /tmp/pass1
4.用vim编辑/tmp/pass1文件,查找文件中所有的bin,再查找bash
vim /tmp/pass1

/bin

/bash
5.将文件中所有的数字0替换成^_^
:%s/0/^_^/g
6.将文件中所有的/替换成@_@
:%s#/#@_@#g
4.如何删除一个单词。然后删除文件中所有的nologin。
:%s#nologin##
5.将10至15行的行首添加#号。最少用两种方法。
:10,15 s@^@#@g
ctrl + v 可视化选中行首按I后加#按两下Esc
6.设置行号(显示行号)
set nu
7.如何将正在编辑的文件另存为到/tmp目录下叫pass.txt?
:w /tmp/pass.txt
8.查看/etc/sysconfig/network-scripts/ifcfg-ens33网卡配置文件内容并显示行号?
cat -n /etc/sysconfig/network-scripts/ifcfg-ens33
9.复制3至8行,粘贴到最后一行
方法一:用可视化复制指定范围的行
3G
V
移动到第10行
y
G
p
方法二:用末行模式复制指定范围的行
:3,8y
G
p
10.将/tmp/pass1文件内的/sbin/nologin替换成/bin/bash
:%s#/sbin/nologin#/bin/bash#g
11.将/tmp/pass1文件中所有的:冒号替换成;分号

sed 's#:#;#g' pass.txt


统计/etc中目录的数量,统计/etc目录中的文件数量。
目录数量:ls -l /etc | cut -c 1 | grep d | wc -l
文件数量:ls -l /etc | cut -c 1 | grep - | wc -l

哇,cut -c1能截取字符串的第一个字符

其中获取文件类型还可以使用awk获取:

ll /etc | awk -F "" '{print $1}'这是以空作为分隔符以空为分隔符,注意-F右边有一个空格,这是凡哥想出来的,好厉害呀,起始呀,这样写是最标准的awk -F “”或cut -d “:” -f1或sort -t “:” -k1,其中只有awk可以以空为分隔符

统计/etc/passwd文件中包含bash关键字的行数。再统计nologin关键字的行数。
grep bash /etc/passwd | wc -l
grep nologin /etc/passwd | wc -l

分别统计/etc、/usr、/usr/sbin、/usr/bin目录的容量大小。
du -hs /etc /usr
du -hs /usr/sbin /usr/bin
注:du是disk usage磁盘空间使用的缩写.

用find查找系统中所有的块设备文件。
find /dev -type b

用find查找系统中所有的字符设备文件。
find /dev -type c

用find在/root目录中查找属于root用户的文件。
find /root -user root

截取ifconfig ens33命令结果中网卡的mac地址(即网卡的物理地址)。
ifconfig ens33|grep ether|tr -s " " |cut -d " " -f 3

 

 

 

 

作业:

交换机和路由器的关系:

静态路由和动态路由:静态路由自己分配ip地址,动态路由DHCP自动分配ip地址

备份:系统备份(操作系统)、用户备份(文件)

每个用户的每个标识是什么?uid

编程语言、上线、领导

系统管理员:资源管理、性能管理、用户管理、进程管理、监控管理、控制管理

linux系统目录的结构:树形结构

/proc:伪文件系统,系统进程相关信息

负载均衡

 

大后期需要整合出一个万能答案

 

周四考试

周日就业课

下个月压力面试

项目,自我介绍

 

打印uid、gid之和

awk -F":" '{print $1,"uid+gid="$3+$4}' /etc/passwd

 

1.对文件编辑
格式要求
姓名 工号 银行卡号 基本工资 绩效 总工资 保险 实发工资

解:
awk 'BEGIN{printf "%-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t%-s\t %-s\t %-s\t %-s\t %-s\t %-s\t %-s\t\n","姓名","工号","银行卡号","基本工资","绩效","总工资","保险","实发工资","\na","007","123456\t","1000\t","100","1100","200","900"}'


2.打印uid小于20的用户的信息
格式要求
用户名 uid gid 家目录

awk -F ":" '$3<20{print $1,$3,$4,$6}'/etc/passwd


3.打印用户的shell为可登陆的shell的用户名及shell
awk -F ":" '/bash$/{print $1,$7}' /etc/passwd

4.分别用shell和awk实现打印九九乘法表

for((i=1;i<=9;i++));do

    for((j=1;j<=i;j++));do

        echo -ne "${j}*${i}=$[j*i]\t"

    done

    echo

done


awk 'BEGIN{for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf"%d*%d=%d\t",j,i,i*j}print ""}}'

5. 这个班的每门课程的平均成绩(每科的平均成绩)
# cat e.txt
jim 80 60 89 80
tom 89 75 80 85
jack 78 96 90 98

解:
awk 'BEGIN{print "yuwen shuxue yingyu tiyu";av_yuwen=0;av_shuxue=0;av_yingyu=0;av_tiyu=0}{av_yuwen+=$2;av_shuxue+=$3;av_yingyu+=$4;av_tiyu+=$5}END{printav_yuwen/NR,av_shuxue/NR,av_yingyu/NR,av_tiyu/NR}' e.txt

 


6.统计每个人的平均成绩

awk 'BEGIN{print"name YW SX YW TY"}{sum=$2+$3+$4+$5;print $1,$2,$3,$4,$5,sum/=4}'e.txt


打印效果如下:
成绩在90分以上的有几人
成绩在80分到90分之间有几人
成绩在80分以下的有几人

解:

awk'BEGIN{dj1=0;dj2=0;dj3=0}{av_score=($2+$3+$4+$5)/(NF-1);print$0,av_score;if(av_score>90){dj1=dj1+1}elseif(av_score<90&&av_score>80){dj2=dj2+1}else{dj3=dj3+1};}END{print"成绩在90分以上的有"dj1"人\n""成绩在80分到90分之间有"dj2"人\n""成绩在80分以下的有"dj3"人"}' e.txt


7.将passwd文件中第一行的每个字段纵向打印
awk -F ":" 'BEGIN{OFS="\n"}NR==1{print$1,$2,$3,$4,$5,$6,$7}' /etc/passwd

注意OFS对$0无效,要将$0分成$1,$2,$3,$4...


8.sed和awk的主要异同

sed:对文件内容编辑(可以不写大括号),流编辑,可以用到正则表达式和替换操作,加-i之后可以直接对源文件进行修改,还能进行原文件备份

awk:动作的部分必须写强引号和大括号,功能大部分是用来输出的,能够以自定的格式来输出,对文本内容进行排版,可以用到正则表达式,但不能使用替换操作
原创粉丝点击