网站建设公告,网站建设立项报告,浙江建设工程信息网查询,网站如何做搜索引擎文章目录1、sed的简单介绍2、sed的使用方法2.1 命令行格式2.2 案例2.3 sed结合正则使用2.4 脚本格式3、awk的简单介绍4、awk的使用方法4.1 命令行模式4.2 脚本模式5、awk内部相关变量5.1 案例6、awk工作原理7、awk进阶使用8、awk脚本编程8.1 案例1、sed的简单介绍
sed是流编辑…
文章目录1、sed的简单介绍2、sed的使用方法2.1 命令行格式2.2 案例2.3 sed结合正则使用2.4 脚本格式3、awk的简单介绍4、awk的使用方法4.1 命令行模式4.2 脚本模式5、awk内部相关变量5.1 案例6、awk工作原理7、awk进阶使用8、awk脚本编程8.1 案例1、sed的简单介绍
sed是流编辑器用于处理文件 sed是一行一行读取文件内容并按照要求进行处理把处理后的结果输出到屏幕 1、首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间) 2、然后根据需求处理临时缓冲区中的行完成后把该行发送到屏幕上
总结 1.由于sed把每一行都存在临时缓冲区中,对这个副本进行编辑所以不会直接修改原文件 2.Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作对文件进行过滤和转换操作
2、sed的使用方法
sed常见的语法格式有两种一种叫命令行模式另一种叫脚本模式。
2.1 命令行格式
语法格式
sed [options] 处理动作 文件名常见选项
选项说明备注-e进行多项(多次)编辑直接在命令列模式上进行 sed 的动作编辑-n取消默认输出在一般 sed 的用法中所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。-r使用扩展正则表达式sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)-i原地编辑(修改源文件)直接修改读取的文件内容而不是输出到终端-f指定sed脚本的文件名直接将 sed 的动作写在一个文件内 -f filename 则可以运行 filename 内的 sed 动作
常见的处理动作 以下所有的动作都要在单引号里
动作说明备注‘p’打印‘i’在指定行之前插入内容类似vim里的大写O‘a’在指定行之后插入内容类似vim里的小写o‘c’替换指定行所有内容‘d’删除指定行
2.2 案例
文件准备
#a.txt
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4: adm:/var/adm:/sbin/nologin
lp:x:4:7:tp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1打印文件内容
sed a.txt #对文件什么都不做但是由于没有-n参数因此还会将文件的内容打印到屏幕sed -n p a.txt #打印每一行并取消默认输出sed -n 1p a.txt #打印第一行sed -n 2p a.txt #打印第二行sed -n 1,5p a.txt #打印1-5行sed -n $p a.txt #打印最后一行增加文件内容(单独成行)
sed $a99999 a.txt #文件最后一行后面增加内容sed a99999 a.txt #文件每行后面增加内容sed 5a99999 a.txt #文件第5行后面增加内容sed $i99999 a.txt #文件最后一行的前面增加内容sed i99999 a.txt #文件每行的前一行增加内容sed 6i99999 a.txt #文件第6行前一行增加内容sed /^uucp/ihello #以uucp开头行的前一行插入内容#在第1行前连续插入3行内容第1中写法只会将要插入的内容看成一行应该遵循第2种写法
sed -n 1i\hello\world\888 a.txt
结果:
helloworld888sed 1i\hello\world\fl a.txt
结果:
hello
world
flsed 2,4a999 a.txt #在2-4行的每一行后面一行都增加内容修改文件内容
sed 5chello world a.txt #替换文件第5行的内容sed chello world a.txt #替换文件所以内容sed 1,5chello world a.txt #替换文件1到5行内容为hello world不是1到5行每一行都替换sed /^user01/c888888 a.txx #替换user01开头的行sed如果需要结合正则需要将正则表达式用斜杠包裹起来例如:
sed /^adm/chello fl a.txt删除文件内容
sed 1d a.txt #删除文件第一行sed 1,5d a.txt #删除文件1到5行sed $d a.txt #删除文件最后一行sed /[0-9]/d a.txt #删除包含数字的行sed -r /([0-9]\.){1,3}[0-9]{1,3}/d a.txt #删除文件中的ip地址-r表示支持扩展正则对文件进行搜索替换操作 语法sed 选项 s/搜索内容/替换内容/动作 需要处理的文件 其中s表示search搜索。斜杠/表示分隔符可以自定义。动作一般是打印p和全局替换g。如果不加g一行中有多个匹配到了只会替换第一个加g则全部替换
sed -n s/root/ROOT/gp a.txt #全文搜索root并替换成ROOTsed -n s/^#//gp a.txt #删除首行以#开头的#相当于取消注释sed -n s/sbin/nologinflgp a.txt #将全文中的/sbin/nologin替换为fl
或者写为sed -n s/\/sbin\/nologinflgp a.txtsed -n 10s/sbin/nologinflgp a.txt #将第10行中的/sbin/nologin替换为fl如果没有就不处理sed -n 1,5s/^/#/gp a.txt #注释前5行sed -n s#\(10.1.1.\)1#\1fl#gp a.txt #(10.1.1.)表示\1把最后一个1替换为fl其他命令
命令含义r从另外文件读取内容w内容另存为保存查找串以便在替换串中引用打印行号!对所选行以外的所有行应用命令,放到行数之后q退出
sed 3r /etc/hosts a.txt #将/etc/hosts中的数据读到a.txt的第3行之后的位置
[rootfl Shell]# sed 3r /etc/hosts a.txt
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 fl fl
adm:x:3:4: adm:/var/adm:/sbin/nologin
lp:x:4:7:tp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1sed 1,5w b.txt a.txt #将a.txt中的1-5行保存到b.txt中sed -n s/^lp/#/gp a.txt #在以lp开头的前面添加#号 和\(\)的作用相同
#lp:x:4:7:tp:/var/spool/lpd:/sbin/nologinsed -n s/^lp/#/gp a.txt #在以lp开头的后面添加#号
lp#:x:4:7:tp:/var/spool/lpd:/sbin/nologinsed -n 1,5!p a.txt #打印非1到5行sed -ne /root/p a.txt -ne /root/ #打印root所在的行并打印行号sed -e /^#/d -e /^$/d a.txt #删除以#开头行(取消注释)删除空行
sed -r /^#|^$/d a.txt2.3 sed结合正则使用
sed 选项 sed’命令或者正则表达式或者地址定位文件名 1.地址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的合。 2.如果没有指定地址. sed将外理输入文件的所有行。 正则说明案例/key/查询包含关键字的行sed -n ‘/root/p’ a.txt/key1/,/key2/匹配包含两个关键字之间的行sed -n ‘/^adm/, /^mysql/p’ a.txt/key/,X从匹配关键字的行开始到文件第x行之间的行(包含关键字所在行)sed -n ‘/^ftp/,7p’x,/key/从文件的第x行开始到与关键字的匹配行之间的行x,y!不包含x到y行
sed -nr /^lp | ^mysql/p a.txt #找出以lp或者mysql开头的行sed -n /sync/,8p a.txt #打印sync所在的行到第8行之间所有的行闭区间sed -n 3,/^halt/p a.txt #从第3行开始打印以halt开头的行之间的所有内容闭区间2.4 脚本格式
用法
#sed -f scripts.sh file //使用脚本处理文件
建议使用 ./sed.sh file脚本的第一行写上
#!/bin/sed -f注意事项 脚本文件是一个sed的命令行清单。’ commands’ 在每行的末尾不能有任何空格、制表符(tab)或其它文本。 如果在一行中有多个命令应该用分号分隔。 不需要且不可用引号保护命令 #号开头的行为注释 3、awk的简单介绍
awk概述 awk是一种编程语言主要用于在linux/unix下对文本和数据进行处理是linux/unix 下的一个工具。数据可以来自标准输入、一个或多个文件或其它命令的输出。 awk的处理文本和数据的方式逐行扫描文件默认从第一行到最后一行寻找匹配的特定模式的行并在这些行上进行你想要的操作。
awk能干啥 1、awk用来处理文件和数据的是类unix下的一个工具也是一种编程语言 2、可以用来统计数据比如网站的访问量访问的IP量等等 3、支持条件判断支持for和while循环
4、awk的使用方法
4.1 命令行模式
语法结构
awk 选项 命令部分 文件名特别说明:
引用Shell变量需要用双引号引起常用选项介绍
-F定义字段分隔符默认分割符是空格-v定义变量并赋值
‘命名部分说明’
正则表达式地址定位
/root/{awk语句} sed中: /root/p
NR1,NR5{awk语句} sed中: 1,5p
/^root/,/^ftp/{awk语句} sed中: /^root/,/^ftp/p{awk语句1;awk语句2;…}
{print $0;print $1} sed中: p
NR5{print $0} sed中: 5p
注: awk命令语句间用分号间隔BEGIN…END…
BEGIN{awk语句};{处理中};END{awk语句}
BEGIN{awk语句};{处理中}
{处理中};END{awk语句}4.2 脚本模式
脚本编写
#!/bin/awk -f
一以下是awk引号里的命令清单不要用引号保护命令多个命令用分号间隔
BEGIN{FS:}
NR1,NR3{print $1\t$NF}
...脚本处理
方法1:
awk 选项 -f awk的脚本文件 需要处理的文本文件
awk -f awk.sh filenamesed -f sed.sh -i filename方法2:
./awk的脚本文件(或者绝对路径) 需要处理的文本文件
./awk.sh filename./sed.sh filename 5、awk内部相关变量
变量变量说明备注$0当前处理的所有记录$1,$2,$3…$n文件中每行以间隔符分割的不同字段间隔符默认是空格awk -F:‘{print $1,$3}’NF当前记录的字段数(列数)awk -F:‘{print NF}’$NF最后一列$(NF-1)表示倒数第二列FNR/NR行号FS定义间隔符‘BEGIN{FS“:”};{print $1,$3}’OFS定义输出字段分隔符默认空格‘BEGIN{OFS“\t”};print $1,$3}’RS输入记录分割符默认换行‘BEGIN{RS“\t”};{print $0}’ORS输出记录分割符默认换行‘BEGIN{ORS“\n\n”};{print$1,$3}’FILENAME当前输入的文件名
5.1 案例
文本准备
head /etc/passwd 1.txt
tail -3 /etc/passwd 1.txt[rootfl Shell]# cat 1.txt
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
fl:x:1000:1000::/home/fl:/bin/bash
yunwei:x:1001:1001::/home/yunwei:/bin/bash
user1:x:1002:1002::/home/user1:/bin/bashawk {print $0} 1.txt #打印每一行(因为没有分隔符$0表示文本中的每一行)awk NR1,NR5{print $0} 1.txt #打印1-5行同下
awk NR1 NR5{print $0} 1.txtawk NR1 || NR5{print $0} 1.txt #打印1和5行awk -F: {print $1,$(NF-1),$NF} 1.txt #打印每一行以冒号分割的第一列倒数第二列和最后一列awk -F: {print NF} 1.txt #每一行以冒号分割并打印每一行的列数awk -F: /root/{print $1,$NF} 1.txt #打印包含root的以冒号分割的第一行和最后一行awk NR1 NR5 /^root/{print $0} 1.txt #打印1-5行中以root开头的行awk BEGIN{FS:;OFS};{print $1,$NF} 1.txt #打印以冒号分割的第一列和最后一列列与列之间用作为分隔符同下
awk BEGIN{FS:;OFS};{print $1$NF} 1.txt #分隔符要用双引号引起来6、awk工作原理
awk -F: {print $1,$3} /ect/passwdawk使用一行作为输入并将这一 行赋给内部交量50每行也可称为一个记录以换行符(RS)结束每行被间隔符:(默认为空格或制表符)分解成字段(或域)每个字段存储在已编号的变量中从$1开始awk使用print函数打印字段打印出来的字段会以空格分隔因为$1$3之间有一个逗号。逗号比较特殊它映射为另一个内部变量称为输出字段分隔符OFSOFS默认为空格awk处理完一行后, 将从文件中获取另一行并将其存储在$0中覆盖原来的内容然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
7、awk进阶使用
格式化的输出print和printf
print函数 类似echo
[rootfl Shell]# date | awk {print Month: $2 \nYear: $NF}
Month: Feb
Year: 2023printf函数 类似echo -n
[rootfl Shell]# awk -F: NR1,NR3{printf %-15s %-10s %-15s\n,$1,$2,$3} /etc/passwd
root x 0
bin x 1
daemon x 2 %s 字符类型 strings
%d 数值类型
- 表示左对齐默认是右对齐
%-15s 表示向左对齐15个字符如果不够用空格填充
printf默认不会在行尾自动换行需要我们手动加上\nawk变量定义
[rootfl Shell]# awk -v NUM3 -F: NR1{print NUM} /etc/passwd
3
[rootfl Shell]# awk -v NUM3 -F: NR1{print $NUM} /etc/passwd
0[rootfl Shell]# awk -v num1 BEGIN{print num}
1
[rootfl Shell]# awk -v num1 BEGIN{print $num}注意:
awk中调用定义的变量不需要加$因为$数字表示特定分隔符分割后的某一列awk中BEGIN…END使用 BEGIN表示在程序开始之前执行 END表示所有文件处理完后执行 用法‘BEGIN{开始处理之前};{处理中};END{处理结束后}’ 案例1打印最后一列和倒数第二列(登录shell和家目录)
[rootfl Shell]# awk -F: BEGIN{printf Login_shell\tLogin_home\n********************\n};{printf $NF\t$(NF-1)\n};END{printf *******************\n} 1.txt
Login_shell Login_home
********************
/bin/bash /root
/sbin/nologin /bin
/sbin/nologin /sbin
/sbin/nologin /var/adm
/sbin/nologin /var/spool/lpd
/bin/sync /sbin
/sbin/shutdown /sbin
/sbin/halt /sbin
/sbin/nologin /var/spool/mail
/sbin/nologin /root
/bin/bash /home/fl
/bin/bash /home/yunwei
/bin/bash /home/user1
*******************案例2打印/etc/passwd里的用户名、家目录以及登录shell
[rootfl Shell]# awk -F: BEGIN{OFS\t\t;print u_name\t\th_dir\t\tshell\n********************};{printf %-20s %-20s %-20s\n,$1,$(NF-1),$NF};END{print ********************} 1.txt
u_name h_dir shell
********************
root /root /bin/bash
bin /bin /sbin/nologin
daemon /sbin /sbin/nologin
adm /var/adm /sbin/nologin
lp /var/spool/lpd /sbin/nologin
sync /sbin /bin/sync
shutdown /sbin /sbin/shutdown
halt /sbin /sbin/halt
mail /var/spool/mail /sbin/nologin
operator /root /sbin/nologin
fl /home/fl /bin/bash
yunwei /home/yunwei /bin/bash
user1 /home/user1 /bin/bash
********************awk和正则的综合运用 这里只写了之前没有出现过的正则符号
运算符说明~匹配!~不匹配
案例
awk NR1,/^lp/{print $0} 1.txt #打印从第一行开始到以lp开头的行中间所有的行闭区间awk /^lp/,NR10{print $0} 1.txt #打印以lp开头的行到第10行中间所有的行闭区间awk /^root/ || /^lp/{print $0} 1.txt #打印以root开头或者以lp开头的行awk NR1 NR 5 $0 ~ /bash$/{print $0} 1.txt #打印1-5行中以bash结尾的行案例3打印IP地址
方法1:
[rootfl Shell]# ifconfig eth0 | awk NR2{print $0} | awk -F[ ] {print $3}
192.168.0.207方法2:
[rootfl Shell]# ifconfig eth0 | grep -w inet | awk -F[ ] {print $3}
192.168.0.207方法3:
[rootfl Shell]# ifconfig eth0 | awk -F[ ] /inet/{print $3} | awk NR1{print $0}
192.168.0.2078、awk脚本编程
流程控制语句 if结构
格式:
awk 选项 正则地址定位{awk语句} 文件名
{ if(表达式) {语句1;语句2;...}}awk -F: {if($3500 $360000) {print $1,$3} } /etc/passwd[rootfl Shell]# awk -F: {if($30) {print $1是管理员} } /etc/passwd
root是管理员[rootfl Shell]# awk -F: BEGIN{if($(id -u)0) {print 当前用户是admin}}
当前用户是adminif…else结构
格式:
{if(表达式) {语句1;语句2;...} else {语句1;语句2;...}}[rootfl Shell]# awk -F: NR1,NR3{if($30) {print $1是管理员} else {print $1不是管理员}} /etc/passwd
root是管理员
bin不是管理员
daemon不是管理员[rootfl Shell]# awk -F: BEGIN{if($(id -u)!0) {print 当前用户不是admin} else {print 当前用户是admin}}
当前用户是adminif…else if…eles结构
格式:
{if(表达式1) {语句1;语句2;...} else if(表达式2) {语句1;语句2;...} else {语句1;语句2;...}}[rootfl Shell]# awk -F: {if($30) {print $1是管理员} else if($31 $3499 || $365534) {print $1是系统 用户} else {print $1是普通用户}} 1.txt
root是管理员
bin是系统用户
daemon是系统用户
adm是系统用户
lp是系统用户
sync是系统用户
shutdown是系统用户
halt是系统用户
mail是系统用户
operator是系统用户
fl是普通用户
yunwei是普通用户
user1是普通用户[rootfl Shell]# awk -F: {if($30) {i} else if($31 $3499 || $365534) {j} else {k}};END{print 管 理员的个数为:i\n系统用户的个数为:j\n普通用户的个数为k} 1.txt
管理员的个数为:1
系统用户的个数为:9
普通用户的个数为3循环语句
打印1-5
awk BEGIN{for(i1;i5;i) {print i}}
awk BEGIN{i1;while(i5) {print i; i}}打印1-10中的奇数
awk BEGIN{for(i1;i10;i2) {print i}}
awk BEGIN{i1;while(i10) {print i; i2}}计算1-5的和
awk BEGIN{for(i1;i5;i) {sumi};{print sum}}
awk BEGIN{i1;while(i5) {sumi;i};{print sum}}[rootfl Shell]# awk BEGIN{for(i1;i5;i) {for(j1;ji;j) {printf j};{print}}}
1
12
123
1234
123458.1 案例
统计系统中各个类型的shell
[rootfl Shell]# awk -F: {shells[$NF]};END{for(i in shells) {print i\tshells[i]}} /etc/passwd
/bin/sync 1
/bin/bash 4
/sbin/nologin 17
/sbin/halt 1
/sbin/shutdown 1统计该服务器的所有访问状态
[rootfl Shell]# netstat -napt | grep ^tcp | awk -F[ ] {states[$6]};END{for(i in states) {print i:states[i]}}
LISTEN:5
ESTABLISHED:9统计访问网站的每个IP的数量
ss -antp | grep 80 | awk -F: !/LISTEN/{ip_count[$(NF-1)]};END{for(i in ip_count) {print i:ip_count[i]}} | sort -k2 -rn | head