Text processing Tools & Bash Shell
文本处理 和 bash shell 基础
++++++++++++++++++++++++
+ Tools for Extracting(提取) Text+
++++++++++++++++++++++++
1.查看文件内容 less、cat、more
2.file excerpts(摘录)head、tail
3.Extracting(提取) by Column(列) or Field(区域)
4.Extracting(提取) by Keyword grep

-----------查看文件内容-----------
a)cat [-AEnTv]
 -A 相当于-vET的整合参数,可以列出一些特殊字符。
 -E 将结尾的换行符$显示出来
 -n 显示行号
 -T 将Tab按键以^I显示出来
 -v 列出一些看不出来的特殊字符

b)less
·<space> 和[pagedown] 向下翻一页
·[pageup] 向上翻一页
·/ 向下搜索
·?向上搜索
·n 重复前一个搜索动作(与/&?有关)
·N 反方向重复前一个搜索动作(与/&?有关)
·q 退出less程序

c)more---翻页查看
·<space> 向下翻一页
·Enter 向下翻一行
·/ 向下搜索“字符串”
· :f立即显示文件名以及当前的行数????
·q 离开退出more程序

-------------数据提取--------------
a)head---取出前几行
head [-n number] 文件
-n 表示显示前多少行,默认前10行

b)tail---取出后几行
tail [-n number] 文件
 -n 显示尾巴多少行,默认显示后10行
 -f 实时显示,立即更新

c)cut --display specific(分隔符) columns of file or STDIN data,主要作用同行数据分解
cut -d '分隔符' -f fields
cut -c 字符范围

-d //定义分隔符是什么,默认是TAB
-f //以分隔符划分,提取第几段数据
-c //从第几个字符到第几个字符
 
eg1:
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@student021 ~]# echo $PATH |cut -d ':' -f 3,5
/usr/local/sbin:/sbin

eg2:
[root@student021 ~]# echo $PATH |cut -c 20-
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@student021 ~]# echo $PATH |cut -c 20-36
/usr/kerberos/bin

eg3:
[root@student021 ~]# last | cut  -d ' ' -f 1
root
root

d)grep--提取过滤字符串
grep [-acinv] '搜索字符串' filename
参数说明:
a ---在二进制文件中以文本文件的方式搜索数据
c ---计算找到的 '搜索字符串' 的次数
i ---忽略大小的不同
n ---输出行号
v ---反向选择,即显示出没有‘搜索字符串’内容的哪一行。

*grep与正则表达式密切相关,具体见附件

eg:
[root@student021 ~]# last | grep -v 'root'
reboot   system boot  2.6.18-194.el5   Thu Feb  2 01:46          (07:50)   
reboot   system boot  2.6.18-194.el5   Thu Feb  2 01:26          (00:18)   
reboot   system boot  2.6.18-194.el5   Sun Mar 27 02:20          (00:03)   
reboot   system boot  2.6.18-194.el5   Mon Dec 20 07:21          (00:01)   
reboot   system boot  2.6.18-194.el5   Mon Dec 20 02:20          (00:29)   
[root@student021 ~]# last | grep 'root'
root     pts/3        192.168.16.16    Thu Feb  2 09:25   still logged in  
root     pts/2        192.168.16.16    Thu Feb  2 01:49   still logged in  
root     pts/1        :0.0             Thu Feb  2 01:48   still logged in

 

++++++++++++++++++++++++
+ Tools for Analyzing(分析) Text +
++++++++++++++++++++++++
1.Text stats---wc
2.Sorting text--- sort & uniq
3.Comparing Files--- diff and patch

a)wc 用来统计一个文件的行数(-l)、词数(-w)、字符数(-c)并送到标准输出

[root@student021 ~]# wc -l /etc/passwd
34 /etc/passwd
[root@student021 ~]# wc -m /etc/passwd
1565 /etc/passwd
[root@student021 ~]# wc -w /etc/passwd
53 /etc/passwd

b)sort用来按各种需要重新排列文本,一般运用在一个管道之后,默认情况下sort按照字母顺序排列文本。
-n    按照数字排序
-r    反向排序
-u    将重复的行去除
-f    ignore 大小写
*sort -u =uniq

[root@student021 ~]# ls -a |sort
.
..
anaconda-ks.cfg
.bash_history
.bash_logout
.bash_profile
.bashrc
.cshrc

c)diff & patch
diff用于比较两个文件之间的区别,并送到标准输出。输出时先报告两个文件的哪一行不同。
该命令告诉用户,为了使两个文件 file1 和 file2 一致,需要修改它们的哪些行。
#diff  file1 file2
字母(a、d和c)之前的行号(n1,n2)是针对file1 的,其后面的行号(n3,n4)是针对 file2 的。字母 a、d 和 c 分别表示附加、删除和修改操作。
5c5---表示前后两个文件第5行不同;

diff -u  file1 file2 > patchfile //以file1为准,把不同存储了(做一个补丁)
patch -b file1 patchfile  //把file1文件和patchfile做了一个拼接(即变成和file2一致了)


++++++++++++++++++++++++++
+ Tools for Manipulating(操纵) Text +
++++++++++++++++++++++++++
1.Alter(translate) Characters: tr
2.Alter string :sed

a)tr---字符转换命令 (only reads data from STDIN)
-d:删除消息中的字符串
-s:替换重复的字符
eg:
[root@student021 /]# tr 'a-z' 'A-Z' < /tmp/lovercase.txt
DJFLKSAJFLJSDK
KDFJLKASDJFL
AAAAAAA
eg2:
[root@student021 /]# cat /tmp/lovercase.txt | tr -s 'a-z' 'A-Z' > /tmp/b.txt        
[root@student021 /]# cat /tmp/lovercase.txt
sjflkjkldjfslkdjf
dsjfklsdjflkds
AAAAAAA
[root@student021 /]# cat /tmp/b.txt         
SJFLKJKLDJFSLKDJF
DSJFKLSDJFLKDS
AAAAAAA

 


b)sed 流编辑器----配合正则表达式,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾.
sed [-nfe&i.bak]  操作
performs search/replace operations on a stream of text
Normally does no alter source file
Use -i.bak to backup and alter source file
*sed 的应用博大精深,这里简单举例
-n 关闭默认的输出而只输出那些带有p标志的行,-n 与p 操作连用
-f 将规则写成一个sed文件,使用'–f '来指定使用的脚本文件
-e 进行多次sed操作,eg:sed -e 's/dog/cat/' -e 's/hello/HELLO/' /tmp/test
-i.bak 备份并修改源文件,eg: sed -i.bak '/hello/d' /tmp/test

操作包括:
p:打印,通-n连用
s:搜索并替换(只会替换每行第一个找到的)
g:替换全部
d:从结果中删除匹配行

eg:
[root@student021 tmp]# cat test.bak
helloword ;dalksfjlkdsjf
word,cat,dog,cat,cat
dog,dog
cat,cat
word helloworld


[root@student021 tmp]# sed '/hello/d' /tmp/test
word,cat,dog,cat,cat
dog,dog
cat,cat


[root@student021 tmp]# sed 's/cat/dog/' test.bak            
helloword ;dalksfjlkdsjf
word,dog,dog,cat,cat
dog,dog
dog,cat
word helloworld


[root@student021 tmp]# sed -n '/cat/p' /tmp/test
word,cat,dog,cat,cat
cat,cat


[root@student021 tmp]# sed '3,5s/cat/dog/g' test.bak //从第3-5行cat全部变dog
helloword ;dalksfjlkdsjf
word,cat,dog,cat,cat
dog,dog
dog,dog
word helloworld

[root@student021 tmp]# sed -e 's/dog/cat/g' -e 's/hello/HELLO/' /tmp/test.bak
HELLOword ;dalksfjlkdsjf
word,cat,cat,cat,cat
cat,cat
cat,cat
word HELLOworld


其他具体见正则表达式.doc


+++++++++++++++++
+ 正则表达式简介 +
+++++++++++++++++
less,grep,sed,perl 等工具支持正则表达式和扩展的正则表达式
简单的正则表达式:

 ^      line Begin
 $ line Ends
 [abc]  A character that is x,y or z
[^abc]  A character that is not x,y or z

*需要注意,“正则表达式的特殊字符”与一般命令行输入命令的“通配符”并不相同,例如,在通配符中,(*)代表0到无限多个字符,但在正则表达式中,(*)则是重复0到多个前一个字符的意思。使用的意义不同,不要混淆。

具体见附件正则表达式.doc