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:/sbineg2:
[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/bineg3:
[root@student021 ~]# last | cut -d ' ' -f 1 root rootd)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 patcha)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/passwdb)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 .cshrcc)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 :seda)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 AAAAAAAb)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