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 中条件操作符
操作符 | 描写叙述 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
~ | 匹配正則表達式 |
! | 不匹配正則表達式 |
在database.txt文件里域 4 匹配 Brown 的记录:
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 编程指南学习笔记(第二部分)的更多相关文章
- Linux Unix shell 编程指南学习笔记(第五部分)
第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...
- Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍 此章节内容较为简单,跳过. 第十七章 条件測试 test命令 expr命令 test 格式 test condition 或者 [ conditio ...
- Linux Unix shell 编程指南学习笔记(第三部分)
第十三章 登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- Linux与unix shell编程指南
第14章 环境和shell变量 1.使用变量时,尽量用花括号将之括起来,防止shell误解变量值. 2.设置变量时的不同模式 variable-name=value 设置实际值到variable-na ...
- 摘自《Linux与unix shell编程指南》
shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...
- JavaScript DOM编程艺术学习笔记-第二章JavaScript语法
一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)
<Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...
随机推荐
- centos7 配置redis
文件上传 yum -y install lrzsz 安装redis部署前操作 同时下载redis-.tar.gz安装包 yum -y install gcc-c++ yum -y install tc ...
- form表单系列中文件上传及预览
文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...
- pcre 不支持 utf 的问题
问题: Error 500 preg_match(): Compilation failed: this version of PCRE is compiled without UTF suppor ...
- 给 “rm” 命令添加个“垃圾桶”
作者: 2daygeek 译者: LCTT amwps290 人类犯错误是因为我们不是一个可编程设备,所以,在使用 rm 命令时要额外注意,不要在任何时候使用 rm -rf *.当你使用 rm 命令时 ...
- php八大设计模式之观察者模式
例如在登录时,需要判断用户是第几次登录,登录过于频繁我们就给用户提示异常.根据用户的爱好,在用户登录后给予相应的猜你喜欢.如果都在 登录时判断密码的方法内完成,不符合面向对对象的单一职责.那我们该怎么 ...
- JavaScript:理解事件循环
话说js是单线程的,它通过浏览器事件循环轮询事件队列,来实现异步.然而,事件循环的时机是什么时候?浏览器是如何帮助JS引擎线程实现异步的? 浏览器页面进程的四个线程 首先说一下,chrome会为每一个 ...
- NodeJS学习笔记 (18)基础调试-console(ok)
模块概览 console模块提供了基础的调试功能.使用很简单,常用的API主要有 console.log().console.error(). 此外,可以基于Console类,方便的扩展出自己的con ...
- python IO编程-序列化
原文链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143192607 ...
- 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引
先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...
- 如何在Google Play上通过电脑下载apk
操作步骤: 1.首先打开翻 墙软件. 2.键入网址:http://apps.evozi.com/apk-downloader/ 3.将Google Play里apk的网址,复制到“Package na ...