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:]"

时间: 2024-08-06 19:46:09

Linux Unix shell 编程指南学习笔记(第二部分)的相关文章

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位

Linux Unix shell 编程指南学习笔记(第五部分)

第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符,该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比如: cat >> tmpfile <<DOC > this is the first line > this is the second line > third > forth >..... >DOC 其中DOC就是分界符,再次在新的行中输入DOC时

Linux Unix shell 编程指南学习笔记(第四部分)

第十六章  shell脚本介绍 此章节内容较为简单,跳过. 第十七章   条件测试 test命令 expr命令 test  格式  test  condition     或者  [ condition ]  (注意: condition两侧有空格) 文件状态测试: - d 目录 : - s 文件长度大于0.非空 : - f 正规文件 - w 可写 : - L 符号连接 : - u 文件有s u i d位设置 - r 可读 : - x 可执行 测试的逻辑操作符: -a   :逻辑与,操作符两边均

Linux Unix shell 编程指南学习笔记(第三部分)

第十三章  登陆环境 登陆系统时,输入用户名和密码后,如果验证通过,则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profile /etc/passwd 文件解析(抽取其中的一行作为示例): 1 2 3 4 5 6 7 root: <span style="white-space:pre"> </span>x: 0: 0: root: <span style="white-space:pre&

Linux与Unix shell编程指南(完整高清版).pdf

找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题.本书内容全面.文字简洁流畅,适合Shell编程人员学习.参考. 目      录 译者序 前言 第一部分   shell 第1章   文件安全与权限 1 1.1   文件 1 1.2   文件

“Linux Shell编程”视频学习笔记

一.Linux Shell基础编程 视频1 1.1.查看你系统shell信息 $ cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 $ echo $SHELL 命令可以查看当前你所使用的shell是哪一个 1.2.查看文件信息,ls $ ls -l 查看文件信息:文件类型.文件权限.文件硬链接数.文件所属用户.文件所属组.文件大小.文件最近修改时间.文件名 1.3.改变文件权限,chmod 只有root用户或者文件的所有者能改变文件的权限 例子:$ chmod

JavaScript DOM编程艺术学习笔记-第二章JavaScript语法

一.JavaScript示例 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8" /> 5 <title>Just a Test</title> 6 </head> 7 <body> 8 <script src="example.js"></scr

Hive编程指南学习笔记(1)

hive一次使用命令: $ hive -e "select * from mytable limit 1;" OK name1 1 name2 2 Time taken: 3.935 seconds $ hive -e "select * from mytable limit 1;" > /tmp/myfile $ cat /tmp/myfile OK name1 1 name2 2 Time taken: 3.935 seconds 静默模式: $ hive

JavaScript面向对象编程指南——学习笔记1

第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对象的程序设计 1.5.1 对象(属性和方法的集合) 1.5.2 类 (相似对象的共同特征,如麻雀.老鹰都是鸟类) 1.5.3 封装 (将属性和方法集合起来,也有封闭作用域的概念,如封装一个播放器对象) 1.5.4 聚合 (将几个对象合并成一个对象) 1.5.5 继承 (一个实例对象继承父级对象的一些属性和方法) 1.5.6 多态 (一个对象调用其他对象的方法,call和apply) 1.6 OPP