shell脚本前奏

一、正则表达式:

正则表达式(Regular Expression,简称RE)就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。即一种匹配模式

常用正则表达式:

1. .代表任意单个字符,如:/l..e/,le中间可以是任意两个字符。

2. ^:以...开始的行

3. $:以....结束的行   “^$”就表示空行

4. [...]:匹配括号中的字符之一

“^”如果出现在[]的起始位置,表示否定,在其他位置是普通字符。(即匹配不在此括号中的任何字符)比如搜索oo前没有g的字符串的行,应用’[^g]oo’作搜索字符串。

5. *:用于修饰前导字符,表示前导字符出现0或任意多次

如:’a*grep’匹配所有0个或多个a后紧跟grep的行。”.*“表示任意字符串

6.\?或?:前导字符可出现0次或1次

7.”\”:用于转义紧跟其后的单个特殊字符,使该特殊字符成为普通字符

如:^\.[0-9][0-9]以一个句点和两个数字开始

8.\{n,m\}:表示前导字符出现n至m次(n和m都是整数,且n<m)

\{n,\}连续的至少n个前导字符

\{n\}连续的n个前导字符

9.\+:表示前导字符出现1或多次

10.|:表示或  如:a|b|c匹配a或b或c

11.(),将部分内容合成一个单位组,比如要搜索glad或good,可以如下’g(la|oo)d’

二、grep命令用法

grep(global search regular expression(RE)and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

参数:

1.-A NUM,--after-context=NUM 除了列出符合行之外,兵器列出后NUM行

如:[[email protected] ~]# grep -A 2 how test

how are you

when are you from

glad

2.-B NUM,--before-context=NUM 与-A NUM相反,显示除符合行之外并显示在它之前的NUM行,

3.-C [NUM],-NUM,--context[=NUM] 列出符合行之外并列出上下各NUM行,默认值为2.

4.-c,--count 不显示符合样式行,只显示符合的总行数。若再加上-v,--invert-match,参数显示不符合的总行数

5.-i,--ignore-case  忽略大小写差别

6.-n,--line-number  在匹配的行前面打印行号

7.-v,--revert-match  反检索,只显示不匹配的行

8.精确过滤:

\<...\>,”...”为匹配内容

9.-s  不显示不存在或无匹配文本的错误信息

如:执行命令grep "root" /etc/password,因为password文件不存在,所以在屏幕上输出错误信息,若使用grep命令-s开关,可屏蔽错误信息

三、sed命令的用法

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间“(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed的基本命令:

1.替换:s命令

用法: sed ‘s/day/night/‘ <old >new
day被替换的字符

Night替换字符

/:分隔符

2.用&表示匹配的字符串

Sed默认只替换搜索字符串的第一次出现,利用  /g  可以替换所有搜索字符串

取得eno16777736网卡ip地址:

[[email protected] ~]# ifconfig eno16777736 | grep "\<inet\>" | sed ‘s/netmask.*//g‘

3.删除行:d命令

删除某文件中所有空行:

Sed ’/^$/d’ filename

将/etc/passwd的内容显示并找印行号,同时将2~5删除

4.增加行:a命令(在指定的行后增加)或i命令(在制定的行前增加)

如果要同时新增多行,则每行之间要用反斜杠\来进行新行的添加

5.取代行:c命令

c的后面可以接字符串,这些字符串可以取代n1,n2之间的行

6.打印:p命令

sed -i 选项可直接修改文件中的内容

7.调用sed的方式

a) 在命令行键入命令,格式:sed [选项] sed命令 输入文件

b) 将sed命令插入脚本文件,然后调用sed。 格式:sed  [选项] -f sed脚本文件  输入文件

c) 将sed命令插入脚本文件,并使sed脚本可执行。格式:sed脚本文件 [选项] 输入文件

不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中接受输入,一般是键盘或重定向结果。

四、awk命令:

awk也是一个数据处理工具!相较于sed常常作用于一整行的处理,awk则比较倾向于一行当中分成数个字段来处理。

·

·.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等。

有三种方式调用awk

1.命令行方式

awk [-F field-separator]  ‘commands’ input-files

其中[ -F 域分隔符] 是可选的,因为awk使用空格或tab键作为缺省的域分隔符。

注:在linux系统中用环境变量IFS存储分隔符,但根据实际应用也可以改变IFS的值.

例如:

脚本执行结果如下:

commands 是真正awk命令, input-files 是待处理的文件

2.shell脚本方式(通sed)

将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。

相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk

3.将所有的awk命令插入一个单独文件,然后调用。

Commands=awk的模式和动作

Awk模式和动作

模式:任何条件语句或正则表达式。

实际动作在大括号{ }内指明。动作大多数用来打印

awk的运行过程:

① 如果BEGIN 区块存在,awk执行它指定的actions。

②  awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)

③  awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。

④  把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。

⑤  当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。

⑥  当awk读完所有的输入行后,如果存在END,就执行相应的actions。

awk内置变量

FILENAME awk浏览的文件名

FS  设置输入域分隔符,等价于命令行-F选项

NF  浏览记录的域个数(每一行($0)拥有的字段总数)

NR 已读的记录数(awk所处理的是第几行数据)

 

五、函数及脚本的综合应用

函数:把要执行的程序代码/脚本封装到一起

函数包括函数名和函数体

定义函数的格式为:

函数名(){

命令1

...

}

例1:删除文件中的空行

这个脚本(脚本名为del.lines)可以处理一个或多个文件。每个文件在用sed删除空行之前要先核实是否存在。

sed的输出被导入一个文件名中含有$ $的临时文件,最后这个临时文件又被移回到原来的文件中。

该脚本使用shift命令取得所有的文件名,用while循环逐个处理所有的文件,直至处理完为止。

注:

1、basename命令能够从路径中分离出文件名。通常用于shell脚本中

2、shift语句用于迁移位置变量,将 $1~$9 依次向左传递

例如,若当前脚本程序获得的位置变量如下:

$1=file1、$2=file2、$3=file3、$4=file4

则执行一次shift命令后,各位置变量为:

$1=file2、$2=file3、$3=file4

再次执行shift命令后,各位置变量为:

$1=file3、$2=file4

例2:如果某些日志文件超过了特定的长度(如8K),那么它的内容将被倒换到另一个文件中,并清除原有文件中的内容.

系统中的有些日志文件增长十分迅速,每天手工检查这些日志文件的长度并倒换这些日志文件(通常是给文件名加个时间戳)是非常乏味的。可以编写一个脚本来自动完成这项工作。该脚本将提交给cron进程来运行,如果某个日志文件超过了特定的长度,那么它的内容将被倒换到另一个文件中,并清除原有文件中的内容。

Ls -l:显示文件实际大小

Du:显示文件所占用的block大小,默认linux系统分区的block size是4K。

仅作为博主学习笔记使用!

时间: 2024-10-09 19:43:52

shell脚本前奏的相关文章

20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)

扩展: select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html 20.5 Shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 1. 创建if1.sh测试脚本: [[email protected] ~]# vi if1.sh a=5,如果a大于3,满足这个条件,显示ok 添加内容: #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 2. 执行if1.sh脚本: [[e

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell脚本交互:expect学习笔记及实例详解

最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是spawn: 后面加上需要执行的shell命令,比如说spawn sudo touch testfile 1.3 expect: 只有spawn执行的命令结果才会被expect捕捉到,因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,Li

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性 作者:赵全文  网名:guestart 我们生产环境的Oracle数据库都做了RMAN备份,是采用了一周的RMAN备份保留策略:除了使用RMAN备份以外,我们还使用了爱数(Eisoo)备份软件来进行备份,可以说是做到了有备无患.可是,如果有一天,Oracle数据库由于主机层面硬件原因或是数据库层面的原因不能对外提供高可用服务的时候,假设数据丢了一大部分,我们只有用RMAN备份来进行恢复,再如果发现,RMAN备份失效了,那就往地缝里

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

利用shell脚本批量修改表

最近公司里因为开发新功能,程序员需要快速在某一个库里的所有表添加字段,于是就用shell脚本简单快速实现批量修改表添加字段 #!/bin/bash export mysql_bin=/usr/local/mysql/bin export database=database export tables=`$mysql_bin/mysql -Bse "use ${database};show tables;"` for i in ${tables}         do          

Shell 脚本模拟 milter 实现黑白名单及关键词过滤

程序执行流程:1. 开始接受邮件.2. 检查发件人是否在黑名单内,如果是拒绝接受;否则继续3. 检查发件人是否在白名单内,如果是接收邮件;否则继续4. 对邮件进行关键字过滤,如果邮件中包含被过滤的关键词信息,则拒绝接收   该邮件;否则,接收该邮件. Usage: sh mailfilter.sh  [-r reject-addr] [-a add-addr][-k keywords]########################################################

Linux Shell脚本攻略(1.12)

1.12 函数和参数 和其他脚本语言一样,Bash同样支持函数,并且可以传递参数. 1.12.1 函数定义和传参 #!/bin/bash function fname() #也可以用fname()代替 { echo $1,$2; #访问参数1和参数2 echo "[email protected]"; #以列表的方式一次性打印所有参数 echo "$*"; #类似于[email protected],但是参数被作为单个实体 return 0; #返回值 } fnam

shell脚本编程学习笔记(1)

在linux上编程,离不开shell,计划好好看看shell编程,并在这里做些笔记以供有相同兴趣的人分享,主要参考<shell脚本学习指南>. 学习shell脚本编程之前,需要了解脚本编程语言和编译型语言的概念. 一般很多中型.大型的程序是用编译型语言写成的,比如C.C++.Java等.这类程序从源代码编译成目标代码,直接通过计算机执行.编译型语言执行效率比较高,大多运作于底层,处理的是字节.整数.浮点数等机器层级的对象,因此实现一个具体的功能,比如"将一个目录里的所有文件复制到另外