sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,该功能不同凡响。处理时,它会把当前处理的行存储在临时缓冲区中,称为”模式空间”( pattern space),接着用sed命令处理缓冲区中的内容,处理成功后,把缓冲区的内容送往屏幕显示,接着理下一行,这样不断重复,直到文件末。文件内容没有改变,除非使用了写入的命令将内容更新。定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
sed [-nefri] ‘command’ 输入文本/文件
常用选项 -n∶取消默认的输出,使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来 -e∶进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑 -f∶指定sed脚本的文件名. 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作 -r∶sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法) -i∶直接修改读取的文件内容,而不是由屏幕输出
常用命令 a ∶ 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) c ∶ 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 d ∶ 删除,因为是删除,所以 d 后面通常不接任何内容 i ∶ 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行) p∶ 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起用 s∶ 取代,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。例如 1,20s/old/new/g
定址用于决定对哪些行进行编辑,地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。地址是一个数字,p则表示行号;“$"符号则表示最后一行。例如: 只打印第三行的内容
$ sed -n '3p' datafile
只显示指定行范围的文件内容,例如:只查看文件的第100行到第200行
$ sed -n '100,200p' mysql_slow_query.log
地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:
$ sed '2,5d' datafile
#删除第二到第五行
$ sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
$ sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容`
假设我们有一文件,文件名为ab
3.1 删除某行
[root@localhost ruby] # sed '1d' ab #删除第一行
[root@localhost ruby] # sed '$d' ab #删除最后一行
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行
3.2 显示某行
[root@localhost ruby] # sed -n '1p' ab #显示第一行
[root@localhost ruby] # sed -n '$p' ab #显示最后一行
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行
3.3 使用模式进行查询
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
3.4 增加一行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
# 代替一行或多行
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end
3.5 替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
3.6 插入
[root@localhost ruby] # sed -i '$a bye' ab # 在文件ab中最后一行直接输入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
3.7 替换:-e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。
$ sed -e '1,10d' -e 's/My/Your/g' datafile
选项-e用于进行多重编辑。第一重编辑删除第1-3行。第二重编辑将出现的所有My替换为Your。因为是逐行进行这两项编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。
3.8 替换两个或多个空格为一个空格
$ sed 's/ */ /g' file_name
3.9 替换两个或多个空格为分隔符
$ sed 's/ */:/g' file_name
3.10 如果空格与tab共存时用下面的命令进行替换
# 替换成空格
$ sed 's/[:space:]]*/ /g' filename
# 替换成分隔符
$ sed 's/[:space:]]*/:/g' filename
在命令行键入命令,将sed命令插入脚本文件,然后调用sed,将sed命令插入脚本文件,并使sed脚本可执行
sed [option] sed命令 输入文件 在命令行使用sed命令,实际命令要加单引号
sed [option] -f sed脚本文件 输入文件 使用sed脚本文件
sed脚本文件 [option] 输入文件 第一行具有sed命令解释器的sed脚本文件
option如下:
n 不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
c 下一命令是编辑命令,使用多项编辑时加入此选项
f 如果正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件
使用重定向文件即可保存sed的输出
使用sed在文本中定位文本的方式
x x为一行号,比如1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行,如/disk/disks/
/pattern/,x 在给定行号上查询包含模式的行,如/disk/,3
x,/pattern/ 通过行号和模式查询匹配行,如 3,/disk/
x,y! 查询不包含指定行号x和y的行
基本sed编辑命令
p 打印匹配行 c/ 用新文本替换定位文本
= 显示文件行号 s 使用替换模式替换相应模式
a/ 在定位行号后附加新文本信息 r 从另一个文本中读文本
i/ 在定位行号后插入新文本信息 w 写文本到一个文件
d 删除定位行 q 第一个模式匹配完成后退出或立即退出
l 显示与八进制ASCII代码等价的控制字符 y 传送字符
n 从另一个文本中读文本下一行,并附加在下一行 {} 在定位行执行的命令组
g 将模式2粘贴到/pattern n/
基本sed编程举例
使用p(rint)显示行: sed -n '2p' temp.txt 只显示第2行,使用选项n
打印范围: sed -n '1,3p' temp.txt 打印第1行到第3行
打印模式: sed -n '/movie/'p temp.txt 打印含movie的行
使用模式和行号查询: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n '1,$'p temp.txt $为最后一行
任意字符: sed -n '/.ing/'p temp.txt 注意是.ing,而不是ing
打印行号: sed -e '/music/=' temp.txt
附加文本:(创建sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此处换行添加文本
HERE ADD NEW LINE. #添加的文本内容
插入文本: /name1/ a/ 改成 4 i/ 4表示行号,i插入
修改文本: /name1/ a/ 改成 /name1/ c/ 将修改整行,c修改
删除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt
替换文本: sed 's/source/OKSTR/' temp.txt 将source替换成OKSTR
sed 's//$//g' temp.txt 将文本中所有的$符号全部删除
sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
从文件中读文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]/& Pass/g' temp.txt
从shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意需要使用双引号
快速一行命令:
's//.$//g' 删除以句点结尾行
'-e /abcd/d' 删除包含abcd的行
's/[]/[]/g' 删除一个以上空格,用一个空格代替
's/^//g' 删除行首空格
's//.*/[]/g' 删除句号后跟两个或更多的空格,用一个空格代替
'/^$/d' 删除空行
's/^.//g' 删除第一个字符,区别 's//.//g'删除所有的句点
's/COL/(.../)//g' 删除紧跟COL的后三个字母
's/^////g' 删除路径中第一个/
、使用句点匹配单字符 句点“.”可以匹配任意单字符。“.”可以匹配字符串头,也可以是中间任意字符。假定正在过滤一个文本文件,对于一个有1 0个字符的脚本集,要求前4个字符之后为X C,匹配操作如下:. . . .X C. . . .
2、在行首以^匹配字符串或字符序列 ^只允许在一行的开始匹配字符或单词。在行首第4个字符为1,匹配操作表示为:^ . . . 1
3、在行尾以$匹配字符串或字符 可以说$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。如果在行尾匹配单词j e t 0 1,操作如下:j e t 0 1 $ 如果只返回包含一个字符的行,操作如下:^ . $
4、使用匹配字符串中的单字符或其重复序列 使用此特殊字符匹配任意字符或字符串的重复多次表达式。
5、使用/屏蔽一个特殊字符的含义 有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。如果要在正则表达式中匹配以 . p a s结尾的所有文件,可做如下操作:/ * / . p a s
6、使用[]匹配一个范围或集合 使用[ ]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增 加模式的可读性。使用“ -”表示一个字符串范围,表明字符串范围从“ -”左边字符开始,到“ -”右边字符结束。假定要匹配任意一个数字,可以使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,则使用:[ A - Z a - z ]表明从A - Z、a - z的字母范围。
7、使用/{/}匹配模式结果出现的次数 使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用/ { / },此模式有三种形式,即:
pattern/{n/} 匹配模式出现n次。
pattern/{n,/} 匹配模式出现最少n次。
pattern/{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。
匹配字母A出现两次,并以B结尾,操作如下:A / { 2 / } B匹配值为A A B 匹配A至少4次,使用:A / { 4 , / } B
替换单引号为空:可以这样写:
$ sed 's/'"'"'//g'
$ sed 's/'''//g'
$ sed s/'//g
在文件的第一行前面插入一行abc
$ sed -i '1i\abc' urfile
https://www.cnblogs.com/ftl1012/p/sed.html
awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk
可能是最方便的工具;awk
其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。
awk的基本用法就是下面的形式。
# 格式 $ awk 动作 文件名 # 示例 $ awk '{print $0}' demo.txt
上面示例中,demo.txt
是awk
所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0
。其中,print
是打印命令,$0
代表当前行,因此上面命令的执行结果,就是把每一行原样打印出来。
下面,我们先用标准输入(stdin)演示上面这个例子。
$ echo 'this is a test' | awk '{print $0}' this is a test
上面代码中,print $0
就是把标准输入this is a test
,重新打印了一遍。
awk
会根据空格和制表符,将每一行分成若干字段,依次用$1
、$2
、$3
代表第一个字段、第二个字段、第三个字段等等。
$ echo 'this is a test' | awk '{print $3}'
上面代码中,$3
代表this is a test
的第三个字段a
。
下面,为了便于举例,我们把/etc/passwd
文件保存成demo.txt
。
root:x:0:0:root:/root:/usr/bin/zsh daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync
这个文件的字段分隔符是冒号(:
),所以要用-F
参数指定分隔符为冒号。然后,才能提取到它的第一个字段。
$ awk -F ':' '{ print $1 }' demo.txt root daemon bin sys sync
除了$ + 数字
表示某个字段,awk
还提供其他一些变量。
变量NF
表示当前行有多少个字段,因此$NF
就代表最后一个字段。
$ echo 'this is a test' | awk '{print $NF}' test
$(NF-1)
代表倒数第二个字段。
$ awk -F ':' '{print $1, $(NF-1)}' demo.txt root /root daemon /usr/sbin bin /bin sys /dev sync /bin
上面代码中,print
命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。
变量NR
表示当前处理的是第几行。
$ awk -F ':' '{print NR ") " $1}' demo.txt 1) root 2) daemon 3) bin 4) sys 5) sync
上面代码中,print
命令里面,如果原样输出字符,要放在双引号里面。
awk
的其他内置变量如下。
FILENAME
:当前文件名
FS
:字段分隔符,默认是空格和制表符。
RS
:行分隔符,用于分割每一行,默认是换行符。
OFS
:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS
:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT
:数字输出的格式,默认为%.6g
。
awk
还提供了一些内置函数,方便对原始数据的处理。函数toupper()
用于将字符转为大写。
$ awk -F ':' '{ print toupper($1) }' demo.txt ROOT DAEMON BIN SYS SYNC
上面代码中,第一个字段输出时都变成了大写。其他常用函数如下。
tolower()
:字符转为小写。
length()
:返回字符串长度。
substr()
:返回子字符串。
sin()
:正弦。
cos()
:余弦。
sqrt()
:平方根。
rand()
:随机数。
awk
内置函数的完整列表,可以查看手册。
awk
允许指定输出条件,只输出符合条件的行,输出条件要写在动作的前面。
$ awk '条件 动作' 文件名
请看下面的例子
$ awk -F ':' '/usr/ {print $1}' demo.txt root daemon bin sys
上面代码中,print
命令前面是一个正则表达式,只输出包含usr
的行。
下面的例子只输出奇数行,以及输出第三行以后的行。
# 输出奇数行 $ awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt root bin sync # 输出第三行以后的行 $ awk -F ':' 'NR >3 {print $1}' demo.txt sys sync
下面的例子输出第一个字段等于指定值的行。
$ awk -F ':' '$1 == "root" {print $1}' demo.txt root $ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt root bin
awk
提供了if
结构,用于编写复杂的条件。
$ awk -F ':' '{if ($1 > "m") print $1}' demo.txt root sys sync
上面代码输出第一个字段的第一个字符大于m
的行。
if
结构还可以指定else
部分。
$ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt root --- --- sys sync
统计频率
a www.baidu.com 20:00
b www.qq.com 19:30
c www.baidu.com 14:00
d www.baidu.com 23:00
e www.qq.com 20:30
f www.360.com 20:30
$ cat test.md | awk -F ' ' '{print $3}'|sort|uniq -c|sort -rn
Linux下查看磁盘与目录的容量—df、du
df:列出文件系统的整体磁盘使用量;
du:评估文件系统的磁盘使用量(常用于评估目录所占容量)
-a:列出所有的文件系统,包括系统特有的/proc等文件系统ls
-k:以KB的容量显示各文件系统
-m:以MB的容量显示各文件系统
-h:以人们较易阅读的GB,MB,KB等格式自行显示
-H:以M=1000K替代M=1024K的进位方式
-T:连同该分区的文件系统名称(例如ext3)也列出
-i:不用硬盘容量,而以inode的数量来显示
在linux下,如果df没有加任何参数,默认将系统内所有的(不含特殊内存内的文件系统与swap)都以1KB的容量列出来
Filesystem:代表该文件系统是在哪个分区,所以列出设备名称
1k-blocks:说明下面的数字单位是1KB,可利用-h或-m来改变容量
Used:使用掉的硬盘空间
Available:剩下的磁盘空间大小
Use%:磁盘使用率
Mounted on:磁盘挂载的目录所在(挂载点)
将容量结果以易读的容量格式显示出来
将系统内的所有特殊文件格式及名称都列出来
将/etc下面的可用的磁盘容量以易读的容量格式显示
将目前各个分区当中可用的inode数量列出
-a : 列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已;
-h : 以人们较易读的容量格式(G/M)显示;
-s : 列出总量,而不列出每个个别的目录占用了容量;
-S : 不包括子目录下的总计,与-s有点差别;
-k : 以KB列出容量显示;
-m : 以MB列出容量显示。
列出目前目录下的所有文件容量
同范例一,但是将文件的容量也列出来
检查根目录下面每个目录所占用的容量
与df不一样的是,du会直接到文件系统内查找所有的文件数据。
du -S 显示当前目录下文件总容量(不包含子目录),而du则在最后显示该目录所有文件的总容量(包含子目录)。
Netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。如果你想确认系统上的 Web 服务有没有起来,你可以查看80端口有没有打开。以上功能使 netstat 成为网管和系统管理员的必备利器。
第一个要介绍的,是最简单的命令:列出所有当前的连接。使用 -a 选项即可。
$ netstat -a
上述命令列出 tcp, udp 和 unix 协议下所有套接字的所有连接。然而这些信息还不够详细,管理员往往需要查看某个协议或端口的具体连接情况。
使用 -t 选项列出 TCP 协议的连接:
$ netstat -at
上面同时显示了 IPv4 和 IPv6 的连接。
默认情况下 netstat 会通过反向域名解析技术查找每个 IP 地址对应的主机名。这会降低查找速度。如果你觉得 IP 地址已经足够,而没有必要知道主机名,就使用 -n 选项禁用域名解析功能。
$ netstat -ant
上述命令列出所有 TCP 协议的连接,没有使用域名解析技术。
任何网络服务的后台进程都会打开一个端口,用于监听接入的请求。这些正在监听的套接字也和连接的套接字一样,也能被 netstat 列出来。使用 -l 选项列出正在监听的套接字。
$ netstat -tnl
现在我们可以看到处于监听状态的 TCP 端口和连接。如果你查看所有监听端口,去掉 -t 选项。如果你只想查看 UDP 端口,使用 -u 选项,代替 -t 选项。
注意:不要使用 -a 选项,否则 netstat 会列出所有连接,而不仅仅是监听端口。
查看端口和连接的信息时,能查看到它们对应的进程名和进程号对系统管理员来说是非常有帮助的。举个栗子,Apache 的 httpd 服务开启80端口,如果你要查看 http 服务是否已经启动,或者 http 服务是由 apache 还是 nginx 启动的,这时候你可以看看进程名。使用 -p 选项查看进程信息。
$ sudo netstat -nlpt
使用 -p 选项时,netstat 必须运行在 root 权限之下,不然它就不能得到运行在 root 权限下的进程名,而很多服务包括 http 和 ftp 都运行在 root 权限之下。
相比进程名和进程号而言,查看进程的拥有者会更有用。使用 -ep 选项可以同时查看进程名和用户名。
$ sudo netstat -ltpe
上面列出 TCP 协议下的监听套接字,同时显示进程信息和一些额外信息。这些额外的信息包括用户名和进程的索引节点号。这个命令对网管来说很有用。
注意 - 假如你将 -n 和 -e 选项一起使用,User 列的属性就是用户的 ID 号,而不是用户名。
netstat 可以打印出网络统计数据,包括某个协议下的收发包数量。下面列出所有网络包的统计情况:
$ netstat -s
如果想只打印出 TCP 或 UDP 协议的统计数据,只要加上对应的选项(-t 和 -u)即可,so easy。
使用 -r 选项打印内核路由信息。打印出来的信息与 route 命令输出的信息一样。我们也可以使用 -n 选项禁止域名解析。
$ netstat -rn
netstat 也能打印网络接口信息,-i 选项就是为这个功能而生。
$ netstat -i
上面输出的信息比较原始。我们将 -e 选项和 -i 选项搭配使用,可以输出用户友好的信息。
$ netstat -ie
上面的输出信息与 ifconfig 输出的信息一样。
我们可以使用 netstat 的 -c 选项持续输出信息。
$ netstat -ct
这个命令可持续输出 TCP 协议信息。
选项 -g 会输出 IPv4 和 IPv6 的多播组信息。
$ netstat -g
目前为止我们列出了 netstat 的基本用法,现在让我们一起来 geek 吧~
active 状态的套接字连接用 "ESTABLISHED" 字段表示,所以我们可以使用 grep 命令获得 active 状态的连接:
$ netstat -atnp | grep ESTA
配合 watch 命令监视 active 状态的连接:
$ watch -d -n0 "netstat -atnp | grep ESTA"
如果你想看看 http,smtp 或 ntp 服务是否在运行,使用 grep。
$ sudo netstat -aple | grep ntp
从这里可以看到 ntp 服务正在运行。使用 grep 命令你可以查看 http 或 smtp 或其它任何你想查看的服务。