shell编程基础之基本文本工具集合

一 shell简介:

1 描述

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
shell环境
shell和Java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行脚本的脚本解释器就可以了
shell的种类众多有
bourne shell(/ur/bin/sh 或 /bin/sh)
nourne again shell(/bin/bash)
c shell (/usr/bin/csh)
K shell (/usr/bin/ksh)
Shell for Root (/sbin/sh)
我们目前关注的是bash,也就是bourne again shell

2 脚本简介

1 什么是脚本

按照一定逻辑关系记录命令的文件

2 如何建立一个shell脚本

A vinX.sh
一般情况下脚本的结尾为".sh"这不是系统规定,是一种业界规范
B
#!/bin/bash 脚本头的写法,这是脚本使用的解释器,也就是默认脚本运行时开启的子shell,也可以使用此方式进行,可以使用相对路径 /usr/bin/env bash 通过env找到X程序并执行他,这样避免了脚本执行程序的路径错误
C
脚本的内容是命令和命令执行的逻辑关系组成

3 脚本的执行方式:

1 chmod +x 然后使用./脚本名称执行
2 通过sh 脚本名称执行

4 脚本编写规范
在vim /etc/vimrc 中书写

按下F4出现以下结果,如此可以简略书写

二 命令集合

1 diff命令

作用:找出两个文件中文本的差异并显示出来
格式:diff [选项] 文件1 文件2
选项:
-u:将两个文件中不同的文本放置在一起,并可以输出到另一个文件中
-r:递归比较目录下的所有文件(比较目录时一定要使用)
实例:


比较结果有3中情况
1 a 第一个文件需要增加输出的内容才能和第二个文件相同
2 c 修改,其中包含增加和修改,或单独修改
3 d 删除,第一个文件中删除不同之后和第二个文件相同
4 <表示右边缺少ashg
5 >i1234表示左边缺少i1234
重定向到文件

解析:@@代表一定范围
"-" 代表第一个文件
"+" 代表第二个文件

2 patch 打补丁

1 查看是否安装
[[email protected] ~]# rpm -qa patch
patch-2.7.1-8.el7.x86_64
2 使用方式
格式:
patch [选项] 原始文件 < 补丁文件
-b :备份原来的文件

源文件以.orig结尾

3 cut 指令

作用:cut是将文件中的每行所选的部分输出到标准输出流中的shell工具,是常用的接单文件处理命令之一,其是以每一行为一个处理对象
格式:
cut [选项] [文件]
主要参数:
-b:以字节为单位进行获取
-c:以字符为单位进行获取
-d:指定分割符,以代替默认的tab
-f:指定选项被分割后的项的位置
-n:该选项和-b是合用的,-nb,意思是不用将多字节进行分割

因为汉字是一个字两个字节,因此取一个字节取不出。
实际应用:
1 抓取网卡IP地址

说明-d " "表示以空格为分割符,-f表示其IP地址在分割之后的相对位置为第十列。
2 获取根目录下磁盘的使用量

4 Sort和uniq

1 总述

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

2 sort 用途

-n 表示按第一列进行排序

-r 倒叙排列

-u 去掉重复数字

-o 输出文件重定向到自己
-t 指定分割符
-k 指定要排序的列

3 uniq 用于去重并结合sort

-u 显示不重复的行
-d 显示重复的行
-c 每行显示并统计重复的次数

6 TEST 用法

1 总述

test可用于测试表达式,支持测试的范围包括:字符串比较,算术比较,文件存在性、属性、类型等判断。例如,判断文件是否为空、文件是否存在、是否是目录、变量是否大于5、字符串是否等于"longshuai"、字符串是否为空等等。在shell中,几乎所有的判断都使用test实现。
其中[]完全等价于test,只是写法不同。双中括号[[]]基本等价于[],它支持更多的条件表达式,还允许在双中括号内使用逻辑运算符"&&"、"||"、"!"和"()",但这些使用单中括号都能实现,只不过多写几个单中括号而已。单中括号[]无法实现的功能是正则表达式匹配,而[[]]可以实现。因此,在能使用单中括号的情况下,无需考虑使用双中括号。
和[ ] 相同 [ -e /mnt ] 前后都要有空格。否则会报错

2 条件表达式

-e file 文件是否存在(exist)
-f file 文件是否存在且为普通文件
-d file 文件是否存在且为块设备.其访问是随机访问
-c file 文件是否存在且为字符设备,其访问是顺序访问
-b file 文件是否存在且为目录
-c file 文件是否存在且为字符设备
-S file 文件是否存在且为套接字
-p file 文件是否存在且为管道文件FIFO
-L file 文件是否存在且为一个链接文件
基本案例其中当条件成立时执行yes ,当条件不成立时执行no

3 文件属性检查。

-r file 文件是否存在且当前用户可读
-w file 文件是否存在且当前用户可写
-x file 文件是否存在且当前用户可执行
-u file 文件是否存在接设置了SUID
-g file 文件是否存在且设置了SGID
-k file 文件是否存在且设置了粘贴位
-s file 文件是否存在且大小大于0字节,即检测文件是否为空白文件
-N file 文件是否存在,且自上次read后是否被modify

4 两个文件之间比较;

File1 -nt file2 判断file1是否比file2新
File1 -ot file2 判断file1是否比file2旧
File1 -ef file2 判断file1与file2是否为同一文件,主要意义在判定,两个文件是否均指向同一个分区上的同一个iNode

5 连个整数之间的判断,支持正负数,但不支持小数,

int1 -eq int2 两数值相等(equal)
Int1 -ne int2 两数值不相等
Int1 -gt int2 n1大于n2
Int1 -lt int2 N2大于N1
Int1 -ge int2 N1大于等于N2
Int1 -le int2 N1 小于n2

6 判定字符串

-z string 判断字符串是否为空,若string为空,则为true
-n string 判断字符串是否为空,若为空,则为false
String1=string2 String1是否和string2 相同,相同则返回true,"=="和"="等价,但"="可移植性更好
String1 == string2
Str1 !=str2 Str1 不等于str2是为真
Str1> str2 Str1大于str2为真
Str1< str2 Str1小于str2为真

7逻辑运算符

-a 或&& a && b 如果a 为正确执行,则执行第二条命令
-o 或|| a||b 如果a 执行不正确, 则执行第二条命令
! 对表达式取反

7 grep

1 总述

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
其模式是由正则表达式、或者字符以及基本文本字符所编写的过滤条件
正则表达式:由一类特殊字符集本文所编写成的模式,其中有些字符不代表字符的字面意思,而是表示控制或通配的功能
分为两类:
1 基本正则表达式(BRE):grep
2 扩展正则表达式(RER):egrep grep -E
说起grep就得说一下基本正则表达式,因为grep是根据基本正则表达式来工作的。
匹配任意单个字符:使用双括号表示弱引用,(意味着括号里面的中间如果有变量,则变量可以被执行,),使用单括号表示强引用,表示直接匹配每个字符。

2 常用功能

选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

grep ‘\<root‘ 文件

grep ‘^root‘ 文件

grep ‘root\>‘ 文件

grep ‘root$’ 文件

其区别是$,^结尾和开始匹配的是行的结尾和开头,而\< 和\> 匹配的是单词的开头和结尾

3 扩展GREP

*0次或多次
?0次或1次
+ 一次或多次
{n} 出现n次
{m,n} 出现m-n次
‘(xy)‘{n} xy 出现n次
x.*y 以x开头y结尾

egrep ‘x|y‘ 文件。匹配x或y所在的行

8 sed

1 总述

sed:stream editor文本编辑器在操作文本的时候是按行进行操作的,所以也叫行编译器。
sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合、交换文件中的资料行,或读入其它档的资料到文>件中,也可替换(substuite)它们其中的字串、或转换(tranfer)其中的字母等等。例如将文件中的连续空白行删成一行、"local"字串替换成"remote"、"t"字母转换成"T"、将第10行资料与第11资料合等.
总合上述所言,当sed由标准输入读入一行资料并放入pattern space时,sed依照sed script 的编辑指令逐一对pattern space内的资料执行编辑,之後,再由pattern space内的结果送到标准输出,接着再将下一行资料读入.如此重执行上述动作,直至读>完所有资料行为止.
小结,记住:
(1)sed总是以行对输入进行处理
(2)sed处理的不是原文件而是原文件的拷贝

2 sed 常用用法

?a\ ?在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

?c\ ?用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行


?i\ ?在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
?d ?删除行


?h ?把模式空间里的内容复制到暂存缓冲区
?H ?把模式空间里的内容追加到暂存缓冲区
?g ?把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
?G ?把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
?l ?列出非打印字符
?p ?打印行


?n ?读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
?q ?结束或退出sed
?r ?从文件中读取输入行
?! ?对所选行以外的所有行应用命令
?s ?用一个字符串替换另一个
?g ?在行内进行全局替换
?w ?将所选的行写入文件
?x ?交换暂存缓冲区与模式空间的内容
?y ?将字符替换为另一字符(不能对正则表达式使用y命令)\
?选项 ?功能
?-e ?进行多项编辑,即对输入行应用多条sed命令时使用
?-n ?取消默认的输出
?-f ?指定sed脚本的文件名

3 Sed 高级用法

1 sed -e ‘s/bin/aaa/g‘ -e ‘s/bbb/ccc/g‘ 文件名
2 sed ‘s/bin/aaa/g;s/bbb/ccc/g‘ 文件名
3 vim rule
s/aaa/bbb/g
s/bbb/ccc/g
Sed -f rule 文件
4 sed ‘s/#/ /g‘ 文件 将#替换成空格

5 sed ‘s/ \/ //g‘ 文件将/替换成空格
6 sed ‘[email protected]/@@g‘ 将/替换成空格

7 sed ‘2s/:/##/g‘ 将第二行的所有: 替换成##

8 sed ‘2,3s/:/##/g‘ 文件 将第二行和第三行的:替换成#

9 sed ‘/root/,/ftp/s/:/##/g‘ passwd

10 sed ‘1s/:/##/g‘ 文件 匹配改变所有

11 sed ‘1s/:/##/‘ 文件 匹配改变第一次出现的

12 sed -n ‘$p‘ 文件 显示最后一行

13 sed ‘G’ 文件,增大行间距

14 sed ‘$!G‘ 文件,不对最后一列增加空白行

9 awk

1 总述:

Awk 是一种编程语言,用于在linux/unix下对文本和数据进行扫描和处理,数据可以来自标准输入/文件/管道
目前在Linux中常用的awk编译器的版本有mawk,gawk ,其中以redhat为代表的使用的是gawk。以Ubuntu为代表的使用的是mawk
Gawk 使GNU project的AWK解释器的开源代码的实现
原理:
awk 逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行相应的操作
AWK基本结构包括模式匹配和处理过程
Pattern {action}
提示:
AWK读取文件内容的每一行时,将对比该行是否与给定的模式向匹配,如果匹配则执行处理过程,否则对该行不做任何处理
如果没有指定处理脚本,则把匹配的行显示到标准输出,及默认处理动作是print打印行,
如果没有指定模式匹配,则默认匹配所有数据
AWK有两个特殊的模式:BEGIN和END,他们被放置在没有读取任何数据之前以及在所有数据读取完成之后执行

2 AWK 基本语法格式

1 格式
Gawk [ x ] -f program-file [ - ] file …
注释: X 表示AWK支持POSTIX以及GNU两种选项,-f后面接脚本文件,file 表示准备处理的文档名称
2 gwak 支持一下选项
-F fs
--field-separator fs
指定以fs作为输入行的分隔符(默认分隔符为空格或制表符)
-v var=val
在处理过程以前,设置一个变量var为val
-f program-file
从脚本文件中读取AWK指令,以取代在命令参数中输出处理脚本
-W compst
-W traditional
--compat
--traditional
使用兼容模式运行AWK,GNU扩展选项将被忽略
-W copyleft
输出简短的GNU版权信息

3 AWK 程序结构

模式 {动作指令}
模式可以是:
EBGIN
END
表达式
表达式,表达式
动作需要以{} 引起起来

4 内置变量

以下为AWK内置变量
ARGC 命令行参数个数
FILENAME 当前输入文档的名称
FNR 当前输入文档的当前记录编号,尤其当有多个输入
文档时有用
NR 输入流的当前记录编号 如果有多个文件,则直接向上进行排序
NF 当前记录的字段个数 记录每一行的字符串数
FS 字段分割符
OSF 输出字段分割符,默认是空格
ORS 输出记录分割符,默认为换行符
RS 输入记录分割符,默认为换行符

1 记录字段:NF 默认的分隔符是空格,此处的代表每行以空格为分隔符的列数

2 记录字段;NR 用于统计文本文件的行数

此为END 用法

3 FILENAME:用于显示当前文件名称,若不在END中,则有多少行,显示多少个文件名

5 字段分隔符:

-F

指定分割符:FS
注意:如果使用FS 改变分隔符的话,需要在begin 处定义FS,因为在读取第一行前就需要改变字段分割符
指定多个字段分隔符

之前是或的关系,全部处理
指定分割符并代替默认分隔符
-OFS 和BEGIN 用法

6 表达式与操作符

表达式由变量、常量、函数、正则表达式、操作符组成,AWK中变量由字符串变量和数字变量,如果在AWK中定义的变量没有初始化,则初始值为空字符串或0
加 +
减 -
乘 *
除 /
取余%
幂运算^
自加 ++
自减--
相加后赋值+=
相减后赋值-=
相乘后赋值*=
相除后赋值 /=
大于>
小于<
大于等于>=
小于等于<=
等于=
不等于!=
&& 与
|| 或

统计空白行

原文地址:http://blog.51cto.com/11233559/2085022

时间: 2024-11-09 11:48:03

shell编程基础之基本文本工具集合的相关文章

周期性任务计划,包管理,sed以及shell编程基础

周期性任务计划,包管理,sed以及shell编程基础 1.每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,"etc-年-月-日-时-分.tar.gz"[[email protected] /]# crontab -e0 /12 /usr/bin/tar -zcf /data/backup/etc-$(date '+%Y-%m-%d--%H-%M').tar.gz /ect/*2.rpm包管理功能总结以及实例应用演示rpm是一个功能十分强大的软件包管理系统,

shell编程基础一(多种方法求值1+2+..+100)

#SHELL编程基础一(多种方法求值1+2+..+100)##为什么要学好shell shell脚本语言是实现linux系统管理及自动化运维所必备的重要工具,linux系统的底层及基础应用软件的核心大都涉及shell脚本的内容. 每一个合格的linux系统管理员或运维工程师,都需要能够熟练地编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容. 只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的工作,从而为个人的职场发展奠定较好的基础.# 本文的宗旨是熟

第十天:shell编程基础与编写Makefile

一:shell编程基础 shell定义:shell是一个作为用户与linux系统间接口的程序.它允许用户向操作系统输入需要执行的命令.shell有很多中,linux系统中shell为bash. shell编程可以看作是一堆命令的集合.和windows中的bat程序类似的脚本程序.为解释性语言. 第一个shell程序是判断两个数字的大小. 1 #!/bin/bash 2 3 num1=10 4 num2=9 5 6 if test $num1 -gt $num2 7 then 8 echo $nu

Linux学习之二十一-shell编程基础

Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell 脚本(shell script),是一种为 shell 编写的脚本程序 Shell 编程跟 java.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了 Linux中的shell种类(shell解释器的种类

6.shell脚本基础和grep文本处理工具企业应用

6.1shell脚本基础-bash变量和逻辑运行 bash特性及bash脚本编程初步 终端:附着在终端接口程序: GUI:KDE,GNome,Xfce CLI:/etc/shells bash的特性 命令行展开:~,{} 命令别名:alias,unalias 命令历史: history 文件名通配:glob 快捷键:Ctrl+a, e, u, k, l 命令补全: $PATH 路径补全: bash特性之:命令hash 缓存此前命令的查找结构:key-vlaue key:搜索值 value:值 h

linux基础学习-17-linux操作系统之Shell编程基础讲解

1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚本的内容.每一个合格的Linux系统管理员或运维工程师,都需要熟练的编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础. 1.2 学好Shell编程所需的基础知识

Shell编程基础篇-上

1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容.每一个合格 的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅 读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适 应曰益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础 1.1.2 什么是shell

shell编程基础-上

1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容.每一个合格 的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅 读系统及各类软件附带的Shell脚本内容.只有这样才能提升运维人员的工作效率,适 应曰益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础 1.1.2 什么是shell

Linux Shell编程基础

在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐藏  -R 显示文件夹内的内容  -c 按照最后一次修改时间排序  -t 按照修改时间排序输出 echo 显示  -n 不换行 touch  创建一个文件,或者修改文件的访问时间和修改时间 touch -a file 只更改访问时间 -m之更改修改实际那 -t指定特定时间 cp  复制文件 -a 保