嵌入式成长轨迹8 【嵌入式环境及基础】【Linux shell强化】【文本过滤】

 

****************************************************

控制流结构 之前成长轨迹2已经提及,不再详叙

不过这里有个很有趣的地方
while read line <testfile.dat
do
   echo $line
done
这个会不断读入第一行

while read line
do
   echo $line
done <testfile.dat
这个就能只读入一次,将文本内容全部输出

猜想是一开始会先读取<之后再执行while里边的

****************************************************


一、正则表达式
1、概念
1)、一种用来描述文本模式的特殊语法
2)、由普通字符以及特殊字符(元字符)组成
3)、用来匹配的字符串
4)、文本过滤工具在某种模式下都支持正则表达式

2、基本元字符集及其含义
^  只匹配行首
$  只匹配行尾
*  匹配0或多个此单字符
[] 只匹配其中字符。可以是单字符或者序列。可以用-表示其中序列范围,如[1-5]表示[12345]。其中逗号将括号内要匹配的不同字符串分开
\  只用来屏蔽一个元字符的特殊含义
.  只匹配任意单字符
pattern\{n\}  只用来匹配前面pattern的出现次数,次数为n
pattern\{n,\}  含义同上。但次数最少为n
pattern\{n,m\} 含义同上,出现次数在n到m之间

^.$ 匹配任意单字符
\*\.pas 匹配以*.pas结尾的所有字符或文件

二、find命令
查找具有某些特征文件的命令

find [path] [option] [-print -exec -ok]
  其中-exec格式-exec command {} \;
  -ok跟-exec类似,不过每次执行命令前都会提示用户
  -xarg exec会发起多个进程,但是xarg只有一个
如: find ./ -perm -7 -print| xargs chmod o-w
  -name
  -perm 按照文件权限来查找文件
  -user
  -nouser
  -group
  -nogroup 查找无有效所属组的文件
  -mtime -n +n 按照文件更改时间查找,-n表示距离现在几天以内,+n表示距离现在几天以前
  -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
  -newer file1 !file2 查找更改时间比文件file1新但比file2旧的文件
  -type 查找某一类型的文件
  man find 查询更多关于find的资料
 
三、grep命令
对文本文件内容进行模式查找

grep [选项] 基本正则表达式 [文件]
字符串参数最好采用双括号括,一者防止被误解为shell命令,二者可以用来查找多个单词组成的字符串

-c 只输出匹配行的计数
-i (只适用于单字符)不区分大小写
-h 查询多文件时不显示文件名
-H 显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行和行号
-s 不显示不存在或无匹配文本的错误信息
-v 显示不包含匹配文本的所有行

类  等价的正则表达式
[[:upper:]] [A-Z]
[[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z]
[[:space:]] 空格或tab
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]

grep "^[^210]" file 开头既不是2、也不是1、也不是0的文件

四、awk介绍
可从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的编程语言。由各种操作和模式组成

三种方式调用awk:
1)命令行模式:
  awk[-F filed-spearator] 'command' input-files
2)awk脚本
  所有awk命令插入一个文件,用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
3)awk命令插入一个单独文件
  awk -f awk-script-file input-files

模式和动作
  模式部分决定动作语句何时触发和触发事件
  动作对数据进行处理,放在大括号内指明
分割符、域和记录
  awk执行时,其浏览域标记为$1,$2,...,$n.这种方法称为域标识。$0为所有域
  注意执行时不要混淆符号$和shell提示符

awk '{print $0"\t"}' score.txt
awk 'BEGIN {print "Name    Maths\n--"}{print $1"\t"$4}END{"end-of-report"}' score.txt

awk中的特殊元字符:+,?(匹配单个字符)
匹配操作符:~(匹配) !~(不匹配)
cat score.txt |awk '$0~/218.222.12.122/'
man awk

六、sed介绍
一种重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合,是非交互性文本流编辑。
sed操作的只是一个拷贝。

调用sed有三种方式
 使用sed的命令行格式为: sed [选项] sed命令 输入文件
 使用sed脚本文件,格式为: sed [选项] -f sed脚本文件 输入文件
 sed脚本文件 [选项] 输入文件
如果没有指定输入文件,sed从标准输入中接受输入

sed命令选项如下:
 -n不打印未匹配行
 -e下一命令是编辑命令
 -f调用sed脚本文件

sed在文件中查询文本的方式
 使用行号,可以是一个简单数字,或是一个行号范围
 使用正则表达式
x 行号
x,y 表示行号范围从x到y
/pattern/ 查询包含模式的行
/pattern/pattern/查询包含两个模式的行
pattern/,x 在给定行号上查询包含模式的行
x,/pattern/通过行号和模式查询匹配行
x,y!查询不包括指定行号x和y的行

基本sed编辑命令
p 打印匹配行
- 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d  删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配后退出
l 显示与八进制ascii代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符

sed -n'2p' score.txt
man sed
info sed

终端

[root@localhost ~]# sed -n '2p' testfile.dat
Name:b Emain:
[root@localhost ~]# sed -n '1,4p' testfile.dat
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:
[root@localhost ~]# sed -n '/Emain/' testfile.dat
sed:-e 表达式 #1,字符 7:missing command
[root@localhost ~]# sed -n '/E/p' testfile.dat
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:aa
Name:b Emain:bb
Name:c Emain:cc
[root@localhost ~]# sed -n '7,/cc/p' testfile.dat
Name:a Emain:aa
Name:b Emain:bb
Name:c Emain:cc
[root@localhost ~]# sed -n '/^$/=' testfile
sed:无法读取 testfile:没有那个文件或目录
[root@localhost ~]# sed -n '/^$/=' testfile.dat
[root@localhost ~]# sed -n '/^$/p' testfile.dat
[root@localhost ~]# sed -n -e '/^$/p'-e'/^$/=' testfile.dat
sed:-e 表达式 #1,字符 6:extra characters after command
[root@localhost ~]# sed -n -e'/^$/p'-e'/^$/=' testfile.dat
sed:-e 表达式 #1,字符 6:extra characters after command
[root@localhost ~]# sed -n -e'/^$/p' -e'/^$/=' testfile.dat
[root@localhost ~]# sed -n '/a/a\t' testfile.dat
t
t
t
t
t
t
t
t
t
[root@localhost ~]# sed -n '/Emain/a\Email' testfile.dat
Email
Email
Email
Email
Email
Email
Email
Email
Email
[root@localhost ~]# cat testfile.dat
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:aa
Name:b Emain:bb
Name:c Emain:cc
[root@localhost ~]# sed -n '/Emain/c\Email' testfile.dat
Email
Email
Email
Email
Email
Email
Email
Email
Email
[root@localhost ~]# cat testfile.dat
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:aa
Name:b Emain:bb
Name:c Emain:cc
[root@localhost ~]# sed -n '/Emain/i\Email' testfile.dat
Email
Email
Email
Email
Email
Email
Email
Email
Email
[root@localhost ~]# cat testfile.dat
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:
Name:b Emain:
Name:c Emain:
Name:a Emain:aa
Name:b Emain:bb
Name:c Emain:cc
[root@localhost ~]# sed '/Emain/i\
> Email' testfile.dat
Email
Name:a Emain:
Email
Name:b Emain:
Email
Name:c Emain:
Email
Name:a Emain:
Email
Name:b Emain:
Email
Name:c Emain:
Email
Name:a Emain:aa
Email
Name:b Emain:bb
Email
Name:c Emain:cc
[root@localhost ~]# sed '/Emain/a\
> Email' testfile.dat
Name:a Emain:
Email
Name:b Emain:
Email
Name:c Emain:
Email
Name:a Emain:
Email
Name:b Emain:
Email
Name:c Emain:
Email
Name:a Emain:aa
Email
Name:b Emain:bb
Email
Name:c Emain:cc
Email
[root@localhost ~]# sed '/Emain/c\
> Email' testfile.dat
Email
Email
Email
Email
Email
Email
Email
Email
Email
[root@localhost ~]# sed '/Emain/s\
> Email' testfile.dat
sed:-e 表达式 #1,字符 9:unterminated `s' command

 

 


七、合并与分割

1、
sort [options] files
 许多不同的域按不同的列顺序分类
 -c 测试文件是否已经分类
 -m 合并两个分类文件
 -u 删除所有复制行
 -o 存储sort结果的输出文件名
 -t 域分隔符,用非空格、非tab键分隔域
 +n n为域号,使用此域号开始分类(这里n从0开始)
 n 指定分类按域上的数字分类
 -r 比较求逆
man  sort

sort -t"." +2 myfile
sort -t"." +2n myfile

2、
uniq [option] files
 从一个文本文件中去除或禁止重复行
 -c 显示各行重复数
 -d 只显示有重复数据行,每种重复行只显示其中一行
 -q 打印每一重复行出现次数
 -f n n为数字,前n个域被忽略,打印不重复行
man uniq

3、join [option] file1 file2

4、spilt
将大文件分割为小文件
一般形式:
 spilt -output_file-size input-filename output-filename
 -b n 每个分割文件的大小n(k,m)
 -C n,每个分割文件一行最多n字节
 -l n,每个分割文件的行数
 -n 同-l n

如split -10 ls_out.txt split

5、cut,paste

posted @ 2012-03-06 19:07  MooreZHENG  阅读(285)  评论(0编辑  收藏  举报