vimsedawk用法总结.docx
- 文档编号:5488805
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:13
- 大小:23.52KB
vimsedawk用法总结.docx
《vimsedawk用法总结.docx》由会员分享,可在线阅读,更多相关《vimsedawk用法总结.docx(13页珍藏版)》请在冰豆网上搜索。
vimsedawk用法总结
sed使用参数
[root@www~]#sed[-nefr][动作]
选项与参数:
-n:
使用安静(silent)模式。
在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。
但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e:
直接在命令列模式上进行sed的动作编辑;
-f:
直接将sed的动作写在一个文件内,-ffilename则可以运行filename内的sed动作;
-r:
sed的动作支持的是延伸型正规表示法的语法。
(默认是基础正规表示法语法)
-i:
直接修改读取的文件内容,而不是输出到终端。
动作说明:
[n1[,n2]]function
n1,n2:
不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在10到20行之间进行的,则『10,20[动作行为]』
function:
a:
新增,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:
取代,c的后面可以接字串,这些字串可以取代n1,n2之间的行!
d:
删除,因为是删除啊,所以d后面通常不接任何咚咚;
i:
插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:
列印,亦即将某个选择的数据印出。
通常p会与参数sed-n一起运行~
s:
取代,可以直接进行取代的工作哩!
通常这个s的动作可以搭配正规表示法!
例如1,20s/old/new/g就是啦!
以行为单位的新增/删除
将/etc/passwd的内容列出并且列印行号,同时,请将第2~5行删除!
[root@www~]#nl/etc/passwd|sed'2,5d'
1root:
x:
0:
0:
root:
/root:
/bin/bash
6sync:
x:
5:
0:
sync:
/sbin:
/bin/sync
7shutdown:
x:
6:
0:
shutdown:
/sbin:
/sbin/shutdown
.....(后面省略).....
sed的动作为'2,5d',那个d就是删除!
因为2-5行给他删除了,所以显示的数据就没有2-5行罗~另外,注意一下,原本应该是要下达sed-e才对,没有-e也行啦!
同时也要注意的是,sed后面接的动作,请务必以''两个单引号括住喔!
只要删除第2行
nl/etc/passwd|sed'2d'
要删除第3到最后一行
nl/etc/passwd|sed'3,$d'
在第二行后(亦即是加在第三行)加上『drinktea?
』字样!
[root@www~]#nl/etc/passwd|sed'2adrinktea'
1root:
x:
0:
0:
root:
/root:
/bin/bash
2bin:
x:
1:
1:
bin:
/bin:
/sbin/nologin
drinktea
3daemon:
x:
2:
2:
daemon:
/sbin:
/sbin/nologin
.....(后面省略).....
那如果是要在第二行前
nl/etc/passwd|sed'2idrinktea'
如果是要增加两行以上,在第二行后面加入两行字,例如『Drinkteaor.....』与『drinkbeer?
』
[root@www~]#nl/etc/passwd|sed'2aDrinkteaor......\
>drinkbeer?
'
1root:
x:
0:
0:
root:
/root:
/bin/bash
2bin:
x:
1:
1:
bin:
/bin:
/sbin/nologin
Drinkteaor......
drinkbeer?
3daemon:
x:
2:
2:
daemon:
/sbin:
/sbin/nologin
.....(后面省略).....
每一行之间都必须要以反斜杠『\』来进行新行的添加喔!
所以,上面的例子中,我们可以发现在第一行的最后面就有\存在。
以行为单位的替换与显示
将第2-5行的内容取代成为『No2-5number』呢?
[root@www~]#nl/etc/passwd|sed'2,5cNo2-5number'
1root:
x:
0:
0:
root:
/root:
/bin/bash
No2-5number
6sync:
x:
5:
0:
sync:
/sbin:
/bin/sync
.....(后面省略).....
透过这个方法我们就能够将数据整行取代了!
仅列出/etc/passwd文件内的第5-7行
[root@www~]#nl/etc/passwd|sed-n'5,7p'
5lp:
x:
4:
7:
lp:
/var/spool/lpd:
/sbin/nologin
6sync:
x:
5:
0:
sync:
/sbin:
/bin/sync
7shutdown:
x:
6:
0:
shutdown:
/sbin:
/sbin/shutdown
可以透过这个sed的以行为单位的显示功能,就能够将某一个文件内的某些行号选择出来显示。
数据的搜寻并显示
搜索/etc/passwd有root关键字的行
nl/etc/passwd|sed'/root/p'
1root:
x:
0:
0:
root:
/root:
/bin/bash
1root:
x:
0:
0:
root:
/root:
/bin/bash
2daemon:
x:
1:
1:
daemon:
/usr/sbin:
/bin/sh
3bin:
x:
2:
2:
bin:
/bin:
/bin/sh
4sys:
x:
3:
3:
sys:
/dev:
/bin/sh
5sync:
x:
4:
65534:
sync:
/bin:
/bin/sync
....下面忽略
如果root找到,除了输出所有行,还会输出匹配行。
使用-n的时候将只打印包含模板的行。
nl/etc/passwd|sed-n'/root/p'
1root:
x:
0:
0:
root:
/root:
/bin/bash
数据的搜寻并删除
删除/etc/passwd所有包含root的行,其他行输出
nl/etc/passwd|sed'/root/d'
2daemon:
x:
1:
1:
daemon:
/usr/sbin:
/bin/sh
3bin:
x:
2:
2:
bin:
/bin:
/bin/sh
....下面忽略
#第一行的匹配root已经删除了
数据的搜寻并执行命令
找到匹配模式eastern的行后,
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
nl/etc/passwd|sed-n'/root/{s/bash/blueshell/;p}'
1 root:
x:
0:
0:
root:
/root:
/bin/blueshell
如果只替换/etc/passwd的第一个bash关键字为blueshell,就退出
nl/etc/passwd|sed-n'/bash/{s/bash/blueshell/;p;q}'
1root:
x:
0:
0:
root:
/root:
/bin/blueshell
最后的q是退出。
数据的搜寻并替换
除了整行的处理模式之外,sed还可以用行为单位进行部分数据的搜寻并取代。
基本上sed的搜寻与替代的与vi相当的类似!
他有点像这样:
sed's/要被取代的字串/新的字串/g'
先观察原始信息,利用/sbin/ifconfig查询IP
[root@www~]#/sbin/ifconfigeth0
eth0Linkencap:
EthernetHWaddr00:
90:
CC:
A6:
34:
84
inetaddr:
192.168.1.100Bcast:
192.168.1.255Mask:
255.255.255.0
inet6addr:
fe80:
:
290:
ccff:
fea6:
3484/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
.....(以下省略).....
本机的ip是192.168.1.100。
将IP前面的部分予以删除
[root@www~]#/sbin/ifconfigeth0|grep'inetaddr'|sed's/^.*addr:
//g'
192.168.1.100Bcast:
192.168.1.255Mask:
255.255.255.0
接下来则是删除后续的部分,亦即:
192.168.1.100Bcast:
192.168.1.255Mask:
255.255.255.0
将IP后面的部分予以删除
[root@www~]#/sbin/ifconfigeth0|grep'inetaddr'|sed's/^.*addr:
//g'|sed's/Bcast.*$//g'
192.168.1.100
多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl/etc/passwd|sed-e'3,$d'-e's/bash/blueshell/'
1root:
x:
0:
0:
root:
/root:
/bin/blueshell
2daemon:
x:
1:
1:
daemon:
/usr/sbin:
/bin/sh
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
直接修改文件内容(危险动作)
sed可以直接修改文件的内容,不必使用管道命令或数据流重导向!
不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试!
我们还是使用下载的regular_express.txt文件来测试看看吧!
利用sed将regular_express.txt内每一行结尾若为.则换成!
[root@www~]#sed-i's/\.$/\!
/g'regular_express.txt
利用sed直接在regular_express.txt最后一行加入『#Thisisatest』
[root@www~]#sed-i'$a#Thisisatest'regular_express.txt
由於$代表的是最后一行,而a的动作是新增,因此该文件最后新增『#Thisisatest』!
sed的『-i』选项可以直接修改文件内容,这功能非常有帮助!
举例来说,如果你有一个100万行的文件,你要在第100行加某些文字,此时使用vim可能会疯掉!
因为文件太大了!
那怎办?
就利用sed啊!
透过sed直接修改/取代的功能,你甚至不需要使用vim去修订!
===awk=============
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本:
awk、nawk和gawk,未作特别说明,一般指gawk,gawk是AWK的GNU版本。
awk其名称得自于它的创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首个字母。
实际上AWK的确拥有自己的语言:
AWK程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。
它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
使用方法
awk'{pattern+action}'{filenames}
尽管操作可能会很复杂,但语法总是这样,其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。
花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。
pattern就是要表示的正则表达式,用斜杠括起来。
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。
awk每接收文件的一行,然后执行相应的命令,来处理文本。
调用awk
有三种方式调用awk
1.命令行方式
awk[-Ffield-separator]'commands'input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。
input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:
#!
/bin/sh
可以换成:
#!
/bin/awk
3.将所有的awk命令插入一个单独文件,然后调用:
awk-fawk-script-fileinput-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
本章重点介绍命令行方式。
入门实例
假设last-n5的输出如下
[root@www~]#last-n5<==仅取出前五行
rootpts/1192.168.1.100TueFeb1011:
21stillloggedin
rootpts/1192.168.1.100TueFeb1000:
46-02:
28(01:
41)
rootpts/1192.168.1.100MonFeb911:
41-18:
30(06:
48)
dmtsaipts/1192.168.1.100MonFeb911:
41-11:
41(00:
00)
roottty1FriSep514:
09-14:
10(00:
01)
如果只是显示最近登录的5个帐号
#last-n5|awk'{print$1}'
root
root
root
dmtsai
root
awk工作流程是这样的:
读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。
默认域分隔符是"空白键"或"[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
如果只是显示/etc/passwd的账户
#cat/etc/passwd|awk-F':
''{print$1}'
root
daemon
bin
sys
这种是awk+action的示例,每行都会执行action{print$1}。
-F指定域分隔符为':
'。
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
#cat/etc/passwd|awk-F':
''{print$1"\t"$7}'
root/bin/bash
daemon/bin/sh
bin/bin/sh
sys/bin/sh
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
cat/etc/passwd|awk-F':
''BEGIN{print"name,shell"}{print$1","$7}END{print"blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
awk工作流程是这样的:
先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。
接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
搜索/etc/passwd有root关键字的所有行
#awk-F:
'/root/'/etc/passwd
root:
x:
0:
0:
root:
/root:
/bin/bash
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则,例如找root开头的:
awk-F:
'/^root/'/etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
#awk-F:
'/root/{print$7}'/etc/passwd
/bin/bash
这里指定了action{print$7}
awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行-F选项
NF浏览记录的域的个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符
此外,$0变量是指整条记录。
$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
统计/etc/passwd:
文件名,每行的行号,每行的列数,对应的完整行内容:
#awk-F':
''{print"filename:
"FILENAME",linenumber:
"NR",columns:
"NF",linecontent:
"$0}'/etc/passwd
filename:
/etc/passwd,linenumber:
1,columns:
7,linecontent:
root:
x:
0:
0:
root:
/root:
/bin/bash
filename:
/etc/passwd,linenumber:
2,columns:
7,linecontent:
daemon:
x:
1:
1:
daemon:
/usr/sbin:
/bin/sh
filename:
/etc/passwd,linenumber:
3,columns:
7,linecontent:
bin:
x:
2:
2:
bin:
/bin:
/bin/sh
filename:
/etc/passwd,linenumber:
4,columns:
7,linecontent:
sys:
x:
3:
3:
sys:
/dev:
/bin/sh
使用printf替代print,可以让代码更加简洁,易读
awk-F':
'
'{printf("filename:
%10s,linenumber:
%s,columns:
%s,linecontent:
%s\n",FILENAME,NR,NF,$0)}'/etc/passwd
print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。
字符串必须用双引号引用,参数用逗号分隔。
如果没有逗号,参数就串联在一起而无法区分。
这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
awk编程
变量和赋值
除了awk的内置变量,awk还可以自定义变量。
下面统计/etc/passwd的账户人数
awk'{count++;print$0;}END{print"usercountis",count}'/etc/passwd
root:
x:
0:
0:
root:
/root:
/bin/bash
......
usercountis 40
count是自定义变量。
之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。
这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:
awk'BEGIN{count=0;print"[start]usercountis",count}{count=count+1;print$0;}END{print"[end]usercountis",count}'/etc/passwd
[start]usercountis0
root:
x:
0:
0:
root:
/root:
/bin/bash
...
[end]usercountis40
统计某个文件夹下的文件占用的字节数
ls-l|awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size}'
[end]sizeis 8657198
如果以M为单位显示:
ls-l|awk'BEGIN{size=0;}{size=size+$5;}END{print"[end]sizeis",size/1024/1024,"M"}'
[end]sizeis 8.25889M
注意,统计不包括文件夹的子目录。
条件语句
awk中的条件语句是从C语言中借鉴来的,见如下声明方式:
if(expression){
statement;
statement;
......
}
if(expression){
statement;
}else{
statement2;
}
if(expression){
statement1;
}elseif(expression1){
statement2;
}else{
statement3;
}
统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):
ls-l|awk'BEGIN{size=0;print"[start]sizeis",size}{if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vimsedawk 用法 总结
![提示](https://static.bdocx.com/images/bang_tan.gif)