一 shell 简介:
1 描述
Shell 是一个用 C 语言编写的程序, 它是用户使用 Linux 的桥梁 Shell 既是一种命令语言, 又是一种程序设计语言
Shell 是指一种应用程序, 这个应用程序提供了一个界面, 用户通过这个界面访问操作系统内核的服务
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell
shell 环境
shell 和 Javaphp 编程一样, 只要有一个能编写代码的文本编辑器和一个能解释执行脚本的脚本解释器就可以了
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 查看是否安装
- [root@node1 ~]# 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 家族包括 grepegrep 和 fgrepegrep 和 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 s@/@@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://www.bubuko.com/infodetail-2523397.html