嵌入式成长轨迹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
[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
[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
[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
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/a\
> Email' 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/c\
> Email' testfile.dat
[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