unix的文件处理sed + wget + awk命令
sed命令
Stream editor - Sed
a streamlined, noninteractive editor 一个精简的、非交互式编辑
format
sed ‘[address]command’ filename(s)
sed 是基于行的,因此按顺序对每一行执行命令。
然后,sed 将其结果写入标准输出(stdout),它不修改任何输入文件。
command
command |function
d| Delete lines
s| Substitutes one string for another.
g| Globally substitutes on a line
p| Print lines
a| Appends one or more lines of text to the current line
i| Inserts text above the current line.
!| Applies the command to all lines except the selected ones.
实例
1.显示文件时,删除文件的指定行数
[s14516@gdufs]$sed '1,15d' /tmp/student_record
删除文件的第一行到十五行,然后显示
当用逗号将两个地址分开时,sed 将把后面的命令应用到从第一个地址开始、到第二个地址
结束的范围。
2.带正则表达式的地址
sed 删除以 ‘#’ 开始的行
$ sed -e '/^#/d' /etc/services
正则表达式地址总是由斜杠括起。
它们指定一种模式,紧跟在正则表达式地址之后的命令将仅适用于正好与该特定模式匹配的行。
3.删除空格的行,然后显示
解释下面的意思:
d是删除的意思
\ 转义
/A ... B/ 表示的是开始A和结束B
^ 开始
* 任意多个
Beginning-of-word \<
End-of-word \>
[s14516@gdufs]$sed '/^$/d' /tmp/student_record
4.删除包含CS的行
[s14516@gdufs]$sed '/\<CS/d' /tmp/student_record
5.不删除包含CS的行 !
[s14516@gdufs]$sed '/\<CS/!d' /tmp/student_record
6.替换
s/regexp/replacement/
[s14516@gdufs]$cat /tmp/space.txt
first line
sencond line
third line
forth line
[s14516@gdufs]$sed 's/^ *//' /tmp/space.txt
s替换掉空格后结果:
first line
sencond line
third line
forth line
7.替换字母E为e
- 只替换一次
[s14516@gdufs]$sed 's/E/e/' /tmp/student_record
- 字符串中的E全部替换 g
[s14516@gdufs]$sed 's/E/e/g' /tmp/student_record
eg:
$ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt
该例将用 'mountains' 替换 'hills',但是,只从空行开始,到以三个字符 'END' 开始的行结
束(包括这两行)的文本块上这样做
8.查找输出
P Print up to the first embedded newline of the current pattern space.
默认输出的过程中,当遇到p命令的时候会再输出一次
[s14516@gdufs]$sed '/\<CS/p' /tmp/student_record
John Doe ECE 3.54
James Davis ECE 3.71
Al Davis CS 2.63
Al Davis CS 2.63
只输出p命令的行
[s14516@gdufs]$sed -n '/\<CS/p' /tmp/student_record
Al Davis CS 2.63
查找e结尾的行'/e$/p'
,只显示匹配到的行(-n)
[s14516@gdufs]$sed -n '/e$/p' /tmp/linux.txt
注意:在windows下可能不能成功,原因看第10点
9.一个字符一个字符显示
[s14516@gdufs]$od -c /tmp/linux.txt
0000000 I a m a s t u d e n t \n t
10.结尾的判断是根据\n来判断的
[s14516@gdufs]$od -c /tmp/linux.txt
0000000 I a m a s t u d e n t \n t
0000020 h i s f i r s t l i n e \n t
0000040 h i s s e c o n d l i n e \n
0000060
[s14516@gdufs]$od -c /tmp/win.txt
0000000 I a m a s t u d e n t \r \n
0000020 t h i s f i r s t l i n e \r
0000040 \n t h i s s e c o n d l i n
0000060 e \r \n
0000063
对于在window下文件是\r\n换行,所以不能成功查找。
修改操作,把文件的\r替换掉
[s14516@gdufs]$sed -i 's/\r//' win.txt
[s14516@gdufs]$sed -n '/e$/p' win.txt
this first line
this second line
wget命令
- 下载网页
wget url
[s14516@gdufs]$wget www.baidu.com
下载后保存为index.html
2.提取网页正文
<a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
s替换操作
[s14516@gdufs]$sed 's/<.*>//' index.html
上面的正则是最大化的匹配<>
结果为空,全部都被替换了
使用最小化的匹配<>
然后g多次应用正则替换多个。否则只替换一次
[s14516@gdufs]$sed 's/<[^>]*>//g' index.html
百度一下,你就知道 新闻 hao123 地图 视频 贴吧 登录 document.write('登录'); 更多产品 关于百度 About Baidu ©2017 Baidu 使用百度前必读 意见反馈 京ICP证030173号
保存替换的结果
-i 是修改并保存
[s14516@gdufs]$sed -i 's/<[^>]*>//g' index.html
替换空格
先替换\r
[s14516@gdufs]$sed -i 's/\r//' index.html
再替换空格
[s14516@gdufs]$sed -i '/^[ \t]*$/d' index.html
AWK工具
a programming language used for manipulating data and generating reports
一种用来处理数据和生成报告的程序设计语言。
awk最基本功能是在文件或字符串中基于指定规则浏览和抽取信息
格式
awk [-F field-separator] ‘commands’ input-file(s)
域和记录
[-F域分隔符]是可选的,因为awk使用空格作为缺省的域分隔符。
field-separator:$1 $2....
awk执行时,其浏览域标记为$1,$2...$n,
这种方法称为域标识,$0
——表示所有域
为打印一个域或所有域,使用print命令。这是一个awk动作(动作语法用花括号括起来)。
awk -F: '{print $1,$6}' /etc/passwd
保存awk的输出
1)使用输出重定向
2)使用tee命令,在输出到文件的同时输出到屏幕。
awk '{print $3}' /etc/fstab | tee fstab.fs
实例
1.指定字段分割符号(-F),然后输出对应的字段(print $1
)
[s14516@gdufs]$awk -F: '{print $1,$3}' /etc/passwd
2.指定多个分割符号([ :])
下面指定看空格和冒号为分隔符,找字段
[s14516@gdufs]$awk -F'[ :]' '{print $1,$3}' /etc/passwd
3.找出满足关系表达式的字段 字段大于3
< 小于
> 大于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
[s14516@gdufs]$awk '$4>3' /tmp/student_record
4.对某个字段进行匹配使用波浪号~ 第四个字段开头是大小写K
~ 匹配正则表达式
!~ 不匹配正则表达式
[s14516@gdufs]$awk '$2~/^[Kk]/' /tmp/databook
[s14516@gdufs]$awk -F: '$0~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
5.字段的算数表达式
[s14516@gdufs]$awk '($2+$3+$4)/3>85' /tmp/grade.txt
定义action
[s14516@gdufs]$awk '($2+$3+$4)/3>85{print $1,($2+$3+$4)/3}' /tmp/grade.txt
6.逻辑表达式
复合模式匹配:
&& AND 语句两边必须同时匹配为真。
|| OR 语句两边同时或其中一边匹配为真。
! 非 求逆
[s14516@gdufs]$awk '$3=="CS" && $4 >= 3' /tmp/student_record
7.匹配学号后三位是4开头
[s14516@gdufs]$awk '$1~/4[0-9][0-9]$/' /tmp/stu.txt
不支持\{2\}
的正则
8.显示行号 NR
[s14516@gdufs]$awk '/\&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;CS/{print NR, $0}' /tmp/student_record
3 Al Davis CS 2.63
8 Rick Marsh CS 2.34
确保整个awk命令用单引号括起来。