首页 > 代码库 > Linux Unix shell 编程指南学习笔记(第二部分)
Linux Unix shell 编程指南学习笔记(第二部分)
第七章 正则表达式介绍
匹配行首与行尾
匹配数据集
职匹配字母和数字
句点 “.” 匹配任意单字符。
^,在行首 匹配字符串或字符序列,如查询当前目录下的所有目录:
ls -l | grep "^d"
匹配所有以sh结尾的行: sh$
匹配所有的空行: ^$
使用*匹配字符串中单字符或重复序列: skdf*jl
使用 \ 转义特殊字符的含义: 特殊字符: $ . ‘‘ ‘ * [ ] | ( ) \ = ? 等。
使用[] 匹配一个范围或集合 , 在[]中使用 - 表示一个字符串范围。
使用 \{ \} 匹配模式结果出现的次数。
pattern \{n\} : 匹配模式出现 n 次 。
pattern \{n,\} : 匹配模式最少出现n次
pattern \{n,m} :p
第八章 grep 家族
grep 参数选项
匹配grep的一般模式
子匹配字母或数字,或者两者混用
匹配字符串范围
grep一般格式(默认从根目录 ‘/’ 开始查询 ):
grep [选项] 基本正则表达式(可为字符串) [文件] (要查找的字符串最好用双引号括起来)
grep 参数选项:
-c : 只输出匹配行的计数
-i : 不区分大小写(只适用于单字符)
-h : 查询文件时不显示文件名
-l : 查询多文件时,只输出包含匹配字符的文件名
-n : 显示匹配行及行号
-s : 不显示不存在或无匹配文本的错误信息
-v : 显示不包含匹配文本的所有行
1、当前目录查询包含good 的所有doc文件:
grep "good" *.doc .
2、统计文件 tmp.txt 中包含 good 字符串的行数
grep -c "good" tmp.txt
3、打印tmp.txt 文件中匹配good的所有行
grep -n "good" tmp.txt
4、打印文件 tmp.txt 中所有不包含 good 的所有行
grep -v "good" tmp.txt
5、精确匹配(只打印包含单词 good 的行 , 像 goodXXX的行则被筛选出去了)
grep "good<Tab>" tmp.txt
6、grep是大小写敏感的的,要查询大小写不敏感需要指定 -i 选项 ,
grep -i "good" tmp.txt
7、匹配一个范围(匹配goo后面可接任意字母)
grep ‘goo[a-zA-Z]’ tmp.txt
8、在tmp.txt文件中匹配以 2 或 1 开头的行
grep ‘^[21]‘ tmp.txt
9、在tmp.txt 文件中匹配不以2 或 1 开头的行
grep ‘^[^21]‘ tmp.txt
10、在 tmp.txt 文件中匹配以 21 开头的行
grep ‘^21‘ tmp.txt
11、在 tmp.txt 文件中匹配以 g 开头 d 结尾 长度为4的字符串
grep ‘g..d‘ tmp.txt
12、范围组合
grep ‘[a-zA-Z0-9]*‘ tmp.txt (匹配任何以字母数字组合的行)
13、模式出现机率
grep ‘3\{2,\}‘ tmp.txt (在tmp.txt文件中查询3至少重复出现两次的行)
3只出现两次 :3\{2\}
3重复出现2到6次: 3\{2,6}
14、grep 中的 与 模式
grep -E "216|217" tmp.txt (-E 允许使用扩展模式)
15、 查询空行
grep ‘^$‘ tmp.txt
16、查询特殊字符
grep "\." tmp.txt (查询 . )
17、查询 ip 地址
grep "[0-9]\{3\}\.[0-9]\{3\}\." tmp.txt
egrep
egrep 代表 expression 或者 extended grep , 它接收所有的正则表达式,用法跟grep类似。
fgrep
fgrep 允许查找字符串而不是一个模式,速度与grep相当。
第九章 AWK 介绍 (操作格式化文本)
抽取域
匹配正则表达式
比较域
向awk传递参数
基本的awk行操作和脚本
awk 语言最基本的功能是在文件或字符串中基于指定规则浏览和抽取信息。
使用awk 的三种方式(awk默认使用空格作为分隔符,但是可以通过-F 指定分隔符):
1、命令行: awk [-F field-separator] ‘commands‘ input-files
2、将所有awk命令插入一个文件,并是awk程序可执行,然后用awk命令解释器作为脚本首行。
3、将所有的awk命令插入一个单独文件,然后调用 awk -f awk-script-file input-file[s]
awk脚本由各种 操作 和 模式 组成。
awk命令格式: awk ‘ [BEGIN] {实际操作} [END]‘ input file[s]
域和记录: awk执行时,浏览域标记为$1 , $2,...$n . 这种方法称为域标识。
$1 , 表示第一域,以此类推 ; $0 表示所有的域
操作示例——创建database.txt文件,内容如下:
M.tansla 05/99 48311 Green 8 40 44 J.lulu 06/99 48317 gree 9 24 26 p.bunny 02/99 48 Yellow 12 26 28 J.troll 07/99 4824 Brown-3 12 26 26 L.Tansla 05/99 412 Brown-2 12 30 28
打印所有内容: awk ‘{print $0}‘ database.txt
打印指定域: awk ‘{print $1,$3}‘ database,txt打印报告头: awk ‘BEGIN {print "Name\tBelt\n--------------------"} {print $1"\t"$4}‘ database.txt
打印信息尾: awk ‘{print $1,$3} {print "read end!"}‘ database.txt
没有指定输入文件时,默认从键盘输入
awk 错误信息规则:
1、确保awk 命令用单引号括起来
2、确保命令内所有引号成对出现
3、确保用花括号括起动作语句,用圆括号括起条件语句
4、可能忘记花括号。
awk 中正则表达式
在awk 中正则表达式用 斜线 括起来 , 如 : /good/
awk 中条件操作符
操作符 | 描述 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
~ | 匹配正则表达式 |
! | 不匹配正则表达式 |
awk ‘{if($4~/Brown/) print $0}‘ database.txt (建议使用这种方法)
awk ‘$0 ~ /Brown/‘ database.txt(另一种取得相同结果的方法)
精确匹配(使用==号):awk ‘$3=="48" {print $0}‘ database.txt (匹配域3等于48的记录,双引号改为单引号结果一致)
不匹配:awk ‘$0 !~ /Brown/‘ database.txt
设置大小写:awk ‘/[Gg]reen/‘ database.txt
使用 && (与) , || (或) , !(非)操作符:
&&: awk ‘{if ($1 ~ /troll/ && $4 ~ /Brown/) print $0}‘ database.txt
|| : awk ‘{if ($1 ~ /lulu/ || $4 ~ /Brown/) print $0}‘ database.txt
!: awk ‘{if ($4 ! /Brown/) print $0}‘ database.txt
awk 内置变量表
A R G C 命令行参数个数 A R G V 命令行参数排列 E N V I R O N 支持队列中系统环境变量的使用 FILENAME a w k浏览的文件名 F N R 浏览文件的记录数 F S 设置输入域分隔符,等价于命令行- F选项 N F 浏览记录的域个数 N R 已读的记录数 O F S 输出域分隔符 O R S 输出记录分隔符 R S 控制记录分隔符
打印已经读取记录的数量: awk ‘END {print NR}‘ database.txt
打印每一条记录域的个数,当前读取的是第几条记录,每条记录的内容,并且读完之后打印记录存储的文件:
awk ‘{print NF,NR,$0} END {print FILENAME}‘ database.txt
NF的另一个强大功能:echo $PWD | awk -F / ‘{print $NF}‘ —— 打印目录或文件名
awk 内置字符串函数
g s u b ( r, s ) 在整个$ 0中用s替代r g s u b ( r, s , t ) 在整个t中用s替代r i n d e x ( s , t ) 返回s中字符串t的第一位置 l e n g t h ( s ) 返回s长度 m a t c h ( s , r ) 测试s是否包含匹配r的字符串 s p l i t ( s , a , f s ) 在f s上将s分成序列a s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p s u b ( r, s ) 用$ 0中最左边最长的子串代替s s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分 s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分
printf 修饰符
- 左对齐 Wi d t h 域的步长,用0表示0步长 . p r e c 最大字符串长度,或小数点右边的位数printf 格式
% c A S C I I字符 % d 整数 % e 浮点数,科学记数法 % f 浮点数,例如(1 2 3 . 4 4) % g a w k决定使用哪种浮点数转换e或者f % o 八进制数 % s 字符串 % x 十六进制数
第十章 sed 用法介绍
s e d是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。s e d可以随意编辑小或大的文件,有许多s e d命令用来编辑、删除,并允许做这项工作时不在现场。s e d一次性处理所有改变,因而变得很有效.
s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。
抽取域
匹配正则表达式
增加、附加、替换
基本的sed名理工和一行脚本
sed 的三种调用方式:
1、 sed [选项] sed命令 输入文件
2、 sed [选项] -f sed脚本文件 输入文件
3、 sed脚本文件 [选项] 输入文件
sed 选项:
n : 不打印 (缺省打印所有行)
p : 打印编辑行
c : 下一命令是编辑命令
f : 指定sed脚本文件
使用sed时,在文本中定位的方式:默认从第一行开始,但是可以通过指定行号或者匹配正则表达式提取自己想要的内容。
X x为一行号,如1 x , y 表示行号范围从x到y,如2,5表示从第2行到第5行 / p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/ / p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s / p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3 x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u / x , y ! 查询不包含指定行号x和y的行。1 , 2 !
sed 编辑命令:
p 打印匹配行 = 显示文件行号 a \ 在定位行号后附加新文本信息 i \ 在定位行号后插入新文本信息 D 删除定位行 c \ 用新文本替换定位文本 s 使用替换模式替换相应模式(s/ pattern / pattern/[p g w n]) r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 l 显示与八进制A S C I I代码等价的控制字符 { } 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 N 延续到下一输入行;允许跨行的模式匹配语句
对文件 sedlearn (默认就指该文件)只打印第二行: sed -n ‘2p‘ sedlearn (如果不写-n , 那么会对所有的内容进行打印,并且第二行会重复打印一次) 。
打印文件范围: sed -n ‘5,9p‘ sedlearn (如果范围超出了文件的行数,那么什么也没有)
打印包含love的行的内容: sed -n ‘/love/p‘ sedlearn
为文件添加行号: sed = sedlearn | sed ‘N;s/\n/: /‘ (N; 读取下一行内容并且追加到当前行末尾 , s/ XXX / YYY/ : 使用YYY模式替换 XXX模式 , 最好使用其他工具增加行号,如: nl)
显示整个文件: sed -n ‘1,$p‘ sedlearn
显示删除指定行后的内容:sed -n ‘3,6d;p‘ sedlearn
追加插入文本: echo "Hello , chen ! " | sed ‘s/ chen/ mr&/g‘
第十一章 合并与分割
sort
uniq
join
cut
paste
split
sort :
sort一般格式 : sort [选项] file
sort 常用选项:
-c :测试文件是否已经分类。
-m :合并两个分类文件。
-u :删除所有复制行(去掉重复的行)。
-o :存储s o r t结果的输出文件名。
-b :使用域进行分类时,忽略第一个空格。
-n :指定分类是域上的数字分类。
-t :域分隔符;用非空格或t a b键分隔域(默认为空格或一系列空格为分隔符)。
-r :对分类次序或比较求逆。
+n :n为域号。使用此域号开始分类。
n :n为域号。在分类比较时忽略此域,一般与+ n一起使用。
-k:指定按照第 多好字段分类 , 比如 2 , 按照字段2 排序。
post1 : 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
实例:
以 : 为域分隔符,先从第一域排序,忽略第二域,然后按第三域排序:sort -t: +1 -2 +3 sortdata.txt
head 和tail
head -n : 查看文件的前 n 行
tail -n : 查看文件的最后 n 行
uniq:
去重复行(连续重复的行才去除,并不保证相同的内容只有一行)
格式: uniq [选项] -f input-file output-file
选项:
-u: 只显示不重复行
-d: 只显示有重复数据行
-c: 打印每一重复行出现次数。
-f : n为数字,前n个域被忽略,一些系统不识别 -f 选项,使用 -n 替代。
join:
join用来将来自两个已排序文档的行链接在一起 (适用于数据量少)
cut
cut 用来从标准输入或文本文件中剪切列或域。
格式: cut [选项] file1 file2
选项:
-c list 指定剪切字符数。
-f field 指定剪切域数。
-d 指定与空格和t a b键不同的域分隔符。
- c 用来指定剪切范围,如下所示:
- c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
-c1-50 剪切前5 0个字符。
-f 格式与- c相同。
-f 1,5 剪切第1域,第5域。
- f 1,10-12 剪切第1域,第1 0域到第1 2域。
paste
paste用来粘贴数据(一般配合cut 使用)
格式: paste [ 选项] file1 file2
选项:
-d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
实例: ls | paste -d"===" - - - - (ls输出结果 以"==="为分隔符,每行显示四列)
split
split 用来将大文件分割成小文件。
格式: split -output-file-size(文本文件被分割的行数) input-file output-file
如: split -3 filename (如果filename 有 10 行, 那么被分割成四个文件,分别为:xaa,xab,xac,xad)
第十二章 tr 用法
tr 用来从标准输入中拖过替换或删除操作进行字符转换。(主要用来转换或抽取控制字符)
大小写转换
去除控制字符
删除空行
格式: tr [ 选项] str_from str_to
选项:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
I n p u t - f i l e是转换文件名。
tr 中控制符的各种表达方式:
速记符含 义 八进制方式
\ a Ctrl-G 铃声 \ 0 0 7
\ b Ctrl-H 退格符\ 0 1 0
\f Ctrl-L 走行换页\ 0 1 4
\n Ctrl-J 新行 \ 0 1 2
\ r Ctrl-M 回车 \ 0 1 5
\t Ctrl-I tab键\ 0 11
\ v Ctrl-X \ 0 3 0
将所有的小写字符转换为大写字符: tr "[a-z]" "A-Z"
例举当前目录下的文件,每行显示4列,让后将小写字母转换为大写字母,并且去掉重复字母:
ls | paste -d " " - - - - | tr -s "[:lower:]" "[:upper:]"
Linux Unix shell 编程指南学习笔记(第二部分)