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

时间:2024-08-19 10:06:50

第七章  正則表達式介绍

匹配行首与行尾

匹配数据集

职匹配字母和数字



句点 “.” 匹配随意单字符。

^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹:

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