811grep

来源:互联网 发布:火星时代有网络班 编辑:程序博客网 时间:2024/05/21 03:17

(一)
grep命令:过滤
grep “keyword” /…/filename

egrep
正则表达式
sort命令:排序
无选项,从数字左到右逐个比较大小然后排序(单个数逐个比较从小到大排序,按这种排序302会排在38前面,3=3,0<8,所以302排在38前面)
-n 按数字大小排序
-t 分隔符
-k 字段
-r 逆序排列,可与其它选项叠加使用
diff和patch命令
diff file1 file2 > file3 比较file1与file2的不同并将不同重定向到file3,此时file3为补丁文件

vim文本编辑器末行模式的文本替换bash的配置文件详解(二)sed流式编辑器

前言:

sed工作机制

Alt text

sed处理文本文件时,首先会被读到模式空间中,而不修改原文件。sed可以对文本文件的所有行进行操作,也可以通过正则表达式进行匹配,使得sed可以只处理模式空间中的被正则表达式匹配到的行。然后再判断模式空间中的文本是否会被正则表达式匹配到,如果匹配到,就会对匹配到的文本做编辑操作,之后再将被编辑的文本和没有被编辑的文本一同输出到标准输出如果模式空间没有被正则表达式匹配到,直接将没有被匹配到的文本原样输出至标准输出1:用法格式

1: sed [选项] 脚本 文件

2:脚本组成:
地址定界
编辑命令

3: 常用的选项
-n:不输出模式模式中的内容至屏幕,也就是不会将没有匹配到的文本输出到标准输出,只是输出编辑到的文本

-e 脚本:可以指定多个脚本,实现多次编辑-f 脚本文件: 每一行一个编辑命令-i:直接修改原文件-r: 表示使用扩展的正则表达式2:地址定界

地址定界(与vim的末行模式类似)
(1)全文匹配:不需要给定地址,表示全文匹配,而vim需要给定%表示全文匹配
(2)单地址匹配:写一个数字即可,例如:8表示匹配第8行
(3)多地址匹配:给定一个范围,
例如:1,9 表示匹配第1行到第9行
例如:1,+2 表示匹配第一行到第三行
(4)模式匹配:
例如:/正则表达式/ 表示正则表达式匹配到的行
例如:1,/正则表达式/ 表示从第一行到正则表达式匹配到的行
(5)步长匹配
例如:1~2 表示所有奇数行
例如:2~2 表示所有偶数行

3:编辑命令

编辑命令 (与vim的末行模式类似)d命令是特例,需要特别注意,不能加-n选项
(1) d: 删除,对应d命令来说,不要安装sed的工作机制去理解,原因是对应d命令而言,没有匹配到的文本是不会输出到标准输出的。例如:下面的sed对yhy文件进行处理,不会将没有匹配到文本的输出至标准输出,而是将编辑后的文本输出到标准输出
例如:
[root@7 ~]# cat yhy
111
222
333
444
[root@7 ~]# sed ‘1,3d’ yhy
444
[root@7 ~]# sed ‘/^#/d’ /etc/fstab # 删除/etc/fstab文件中以#开头的行

UUID=396430ca-28ec-4c44-8e8e-171c92800306 / xfs defaults 0 0
UUID=8e454dca-4ea4-416b-8234-0b0a4570ad6e /boot xfs defaults 0 0
UUID=64654a8f-23bc-45e6-8c9c-fbdc07538547 swap swap defaults 0 0

(2)p: 打印
一定要-n选项,如果不加-n那么打印的行将会显示两遍
[root@7 ~]# sed -n ‘3,4p’ /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Feb 6 21:08:54 2017

(3)a\字符串:在行后面追加字符串,支持使用\n实现多行追加
例如:sed ‘5a\new_line’ /etc/fstab:表示在第五行后面,也就是第六行插入new_line字符串,其后的行一次向下移动

(4)i\字符串:在行前面插入字符串,支持使用\n实现多行插入
例如:sed ‘5i\new_line’ /etc/fstab :表示在第5行插入new_line字符串,其后的行一次向下移动

(5)c\字符串:把匹配到的行替换为字符串
例如:sed ‘3c\yhy’ /etc/fstab 将第三行替换为yhy字符串

(6)w 文件路径:将匹配到的行重定向至指定的文件中
例如:sed ‘/^[^#]/w yhy.txt’ /etc/fstab 将非井号开头的行保存至yes.txt文件中

(7)r 文件路径:读取指定文件的内容插入到当前文件被匹配到的行处
例如: sed ‘3r /etc/issue’ /etc/fstab 将/etc/issue中的内容插入到第3行的文本后面

(8)=:表示被模式匹配到的行上面加上一个行号
sed ‘/^UUID/=’ /etc/fstab

(9)!:取反条件
例如:sed ‘/^#/!d’ /etc/fstab 将不是以#好开头的行删除

(10)s///:查找替换,常用的有s@@@, s### ,
修饰符有:
g:全局替换,表示可以替换一行中多次匹配到的字符串。如果不加g,那么只能替换一行中第一次出现的字符串
w 文件路径:替换成功的结果保存至指定文件中
p :显示替换成功的行

(三)sed练习

前言:sed操作文本的时候,基于经验来看,如果使用的编辑命令是p,那么需要加上-n选项,表示取消默认的输出,其他的编辑命令都不要加-n选项

1:删除/etc/grub2.cfg文件中所有的以空白字符开头的行的行首的所有空白字符

sed ‘s/^[[:space:]]+//’ /etc/grub2.cfg

2:删除/etc/fstab文件中所有以#开头的行的行首的#号且紧跟#号后面的所有空白字符

sed -r ‘s/^#[[:space:]]*//’ /etc/fstab

3:输出一个绝对路径给sed命令,取出其文件名

echo “/var/log/messages” | sed -r ‘s#^./(.)#\1#’ 正确
echo “/var/log/messages” | sed -r ‘s/^./(.)/\1/’ 错误
echo “/var/log/messages” | sed ‘s/^.\/(.)/\1/’ 正确, 不用扩展正则表达式

4:输出一个绝对路径给sed命令,取出其目录名,相当于dirname

echo “/var/log/messasdfasdf/” | sed -r ‘s#(.)/.#\1#’

(四)bash编程权威指南1

前言:bash脚本语言是一种解释型的语言,什么是解释型语言呢?程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。因此效率比较低。bash脚本语言需要运行在shell平台上,就像Python代码需要运行在pyenv虚拟环境中运行,js在浏览器的js引擎中运行,在node.js的平台上运行一样

bash脚本语言文件格式

第一行#!/bin/bash :定义bash脚本解释器
注释信息:#
代码注释:
缩进,适度添加空白行

bash中的变量介绍

局部变量
本地变量
环境变量
位置参数变量
特殊变量

变量的类型

1:字符类型
2:数值类型
精确类型
近似类型
3:弱类型:字符型

bash中支持的运算符以及变量赋值的表达时候
  • , - , * , / , % , **

1:let var=var1+var2

2:var=[expression]expression[ ]之后就变成了算数运算, 例如:var=$[ 1+2 ]

3:var=$(命令) 这里是将命令输出的结果赋值var变量

4:注意:乘法有些时候需要转义

5:let i=i+1 等价于 let i+=# 等价于 let i++  
   let i=
i-1 等价于 let i-=# 等价于 let i–

入门小测试1 .计算/etc/passwd文件中的第10个用户和第20个用户的id号之和

idn10=(sedn10p/etc/passwd|cutd:f3)idn20=(sed -n 20p /etc/passwd|cut -d: -f3)
let idn=idn10+idn20

2 .计算/etc/rc.d/init.d/functinos和/etc/inittab文件的空白行数之和注意:这里在写正则表达式的时候,要搞清楚空白行和以空白字符开头的行的正则表达式写法不一样空白行:egrep "^[[:space:]]*$" yhy以空白字符开头的行:egrep "^[[:space:]]+" yhy

idn1=(egrep"[[:space:]]”/etc/rc.d/init.d/functinos)
idn2=(egrep"[[:space:]]” /etc/inittab)
let idn=idn1+idn2

(五)bash编程权威指南2

前言:条件测试语法有两种书写模式,一种是[ expression ], 另一种是[[ expression ]],为了在书写条件测试的过程中,不让大家将两种格式相互混淆,那么在这里我只讲一种格式,也就是第一种格式[ ]。因为第一种格式在书写过程中基本不会写错,而第二种格式经常会写错,且第一种格式在很多服务的启动脚本中经常看到,因此应用广。那么为了降低bash编程的门槛,在这里我只讲解第一种,如果对shell编程感兴趣的同学,可以查看《shell脚本编程大全》一书
判断某需求是否满足,需要由测试机制来实现,下面我们就讲讲如何编写测试表达式来实现所需的测试

**条件测试的状态返回值和书写格式**

1:执行命令,利用状态返回值来判断
0:成功
1-255:失败
补充:bash里0为真
2:测试表达式
test expression
[ expression ] 常用
[[ expression ]]

**bash的测试类型**数值测试字符串测试文件测试数值测试:数值比较-eq:是否等于 [ $num1 -eq $num2 ]       equal ->e-ne:是否不等于 [ $num1 -ne $num2 ]      no equal ->ne-gt:是否大于 [ $num1 -gt $num2 ]      great than ->gt-ge:是否大于等于 [ $num1 -ge $num2 ]    great equal ->ge-lt:是否小于 [ $num1 -lt $num2 ]      less than ->lt-le:是否小于等于 [ $num1 -le $num2 ]    less equal ->le字符串测试:字符比较    ==:是否等于     >:是否大于<:是否小于!=:是否不等于=~:左侧字符串是否能够被右侧的pattern所匹配-z“string”:判断指定的字符串是否为空 ,空则为真,不空则假-n“string”:判断指定的字符串是否为不空 ,不空则为真,不空则假注意:(1)字符串要加引号(2)在做字符串的比较的时候,格式如下: if [ "$VARIABLE" == "$VARIABLE" -a "$VARIABLE" == "cpu" ];then 需要在运算符号两边有空格,并且使用双引号将字符串包裹起来,这样即使是变量也可以替换文件测试存在性测试-a file-e file 文件的存在性测试,存在为真,否则为假文件类型测试 -b file:是否存在并且为块设备文件-c file:是否存在并且为字符设备文件-d file:是否存在并且为目录文件-f file:是否存在并且为普通文件-h/l file:是否存在并且为符号链接文件-p file:是否存在并且为管道文件-S file:是否存在并且为套接字文件文件权限测试 -r file:是否存在并且为当前用户可读-w file:是否存在并且为当前用户可写-x file:是否存在并且为当前用户可执行特殊权限测试 -u file:是否存在并且为拥有SUID权限-g file:是否存在并且为拥有GUID权限-k file:是否存在并且为拥有Sticky权限文件是否有内容     -s file:是否存在并且有内容变量是否有为空,为空则为真     -z "$VARIABLE"文件的时间戳测试     -N file:文件自从上次被读取后是否修改过从属关系测试     -O file:当前用户是否为文件的属主    -G file:当前用户是否属于文件的属组双目测试     file1 -ef file2:是否为同一文件系统上的指向同一iNode的硬链接    file1 -nt file2:file1 是否新于file2    file1 -ot file2:file1 是否旧于file2组合条件测试逻辑运算第一种方式 COMMAND1 && COMMAND2COMMAND1 | | COMMAND2! COMMAND[-O file]&&[-r file]第二种方式 [ expression -a expression ]:与运算[ expression -o expression ]:或运算! expression:非运算例如:[ -O file -a -x file ]脚本的状态返回值1:默认是脚本执行的最后一条命令的返回值2:自定义状态退出状态码 exit [n]:n为自己指定的状态码 注意:shell进程遇到exit时候,会立即终止,整个脚本执行结束条件测试小练习将当前主机名称保存至hostName变量中,主机名如果为空,或者为localhost,将其设置为uplooking.comhostName=$(hostname)[ -z "$hostName" -o "$hostName"=="localhost.domain" -o "$hostName"=="localhost" ]&&hostname uplooking.com向脚本传递参数位置参数变量ls /etc/init.d/network:其中/etc/init.d/network为位置参数myscript.sh argu1 argu2 在脚本文件中的引用方式: $1 , $2 ...: 表示给脚本传递的第一个参数和第二个位置参数到了两位数的时候用 ${10} , ${11},因为$11会产生歧义。轮替 shift [n] :位置参数轮替位置参数小练习写一个脚本,通过命令行传递两个文本文件路径名给脚本,计算两个文件的空白行之和!#/bin/bash# descriptionfile_line1=$(egrep "^[[:space:]]*?" $1|wc -l)file_line2=$(egrep "^[[:space:]]*?" $2|wc -l)echo "the total lines of this two files is $[ $file_line1+$file_line2 ]"特殊变量$0:脚本文件路径名称本身$#:保存了脚本参数的个数$*:所有参数$@:所有参数过程式编程语言的代码执行顺序顺序执行:逐条运行选择执行: 代码存在一个或多个分支,只执行其中一个代码有一个分支:条件满足时才会执行两个或以上的分支:只会执行其中一个满足条件的分支循环执行: 代码片段(循环体)要执行0,1或多个来回选择执行: 单分支的if语句
原创粉丝点击