shell脚本、awk、sed用法
shell sed awk
什么是shell
翻译官 内核与用户之间的解释器程序(/bin/bash)
shell种类
配置文件:/etc/shells/bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin/bin/tcsh/bin/csh
规范脚本的构成
#!表明解释器
#注释信息
可执行的命令
脚本的执行方式
加x执行权限 [绝对路径 相对路径] 开启子进程
bash 脚本文件; sh 脚本文件 开启子进程
source 脚本文件;脚本文件 不开子进程
变量的类型
环境变量user (当前登录的系统用户)UID (当前登录用户的uid)pwd (当前所在路径)home (当前用户家目录)ps1 (一级提示符)ps2 (二级提示符)
位置变量$1 $2 $3
预定义变量$0 执行脚本的名字$? 返回上一条命令的结果(0正确 非0错误)$$ 当前脚本的进程号$# 统计位置变量个数$* 所有位置变量的值
自定义变量变量民的要求(1)数字、字母、下划线组成(2)不能以数字开头(3)等号两边不能有空格(4)如果变量有值,则会覆盖
定义变量
变量名=变量值 ch=18read -p "请输入您要查询的用户名:" nameexport 定义全局变量
取消变量
unset export -n 撤销全局变量(变量存在)
引号的区别
“”: 切丁范围‘’: 界定范围 屏蔽特殊字符的含义``或$():获取命令的输出结果
shell中的运算
+ - * / %
方法一:expr 1 + 1 (注意必须有空格)
\转义符号:屏蔽之后一个字符的特殊含义【主要在乘法中运用】方法二:echo $[] ; echo $(())方法三:改变变量本身的值,不显示结果let a=a+1let a+=1let a++方法四:bc工具scale:scale=N(数字) 指定小数位的长度
测试
条件测试:格式: test 表达式; [ 表达式 ]
字符串测试:== !=
数值测试:-eq 等于 -ne 不等于-gt 大于 -ge 大于等于-lt 小于 -le 小于等于
文档测试:-e 判断是否存在,不区分文件或目录-d 判断是否为目录-f 判断是否为文件-r 判断是否可读(对root用户无效)-w 判读是否可写(对root用户无效)-x 判断是否可执行
#取反测试:加!
判断
逻辑判断&& 且 前面任务成功,才执行后续任务|| 或 前面任务失效,才执行后面任务; 前面无逻辑关系 前面执行完毕后,继续执行后面任务
if判断if单分支结构:if 条件测试;then命令序列fiif双分支结构:if 条件测试1;then命令序列1else命令序列2fiif多分支结构:if 条件测试1;then命令序列1elif 条件测试2;then命令序列2elif 条件测试n;then命令序列3else命令序列4fi
循环
for循环 (有限循环)for 变量名 in 值列表do命令序列done#值列表: (1)1 2 3 4(2){1..4}(3)`cat /user.txt` 或 $(cat /user.txt)while循环 (无限循环)while 条件测试do命令序列done#ping -c 选项可以设置ping的次数-i 选项可以设置多次ping之间的间隔时间(单位秒)-w 选项可以设置ping不通时的超时时间#随机数$RANDOMcase判断格式case 变量 in模式1)命令序列1;;模式2)命令序列2;;...*)默认命令序列esac
函数的定义方法
方法一:function 函数名{命令序列...}方法二:函数名(){命令序列...}
函数的调用
直接使用“函数名”的形式调用,如果该函数能够处理位置参数,则可以使用“函数名 参数1 参数2.. ...” 的形式调用。
shell版本的fork炸弹
#!/bin/bash
.(){
.|.&
}
.
中断及退出
break 可以结束整个循环
continue 结束本次循环体,进入下一次循环
exit 结束整个脚本
字符串截取及切割
子串截取的用法:${变量名:起始位置:长度} //起始位置从0开始
子串替换的两种用法:只替换第一个匹配结果:${变量名/old/new}
替换全部匹配结果:${变量名//old/new}
字符串掐头去尾:从左向右,最短匹配删除:${变量名#*关键词}从左向右,最长匹配删除:${变量名##*关键词}从右向左,最短匹配删除:${变量名%关键词*}从右向左,最长匹配删除:${变量名%%关键词*}
字符串初值的处理
${变量名:-变量值}:判断变量是否存在,决定变量的初始值
正则
基本正则. 匹配任意单个字符* 匹配前一个字符任意次数(不允许单独使用)^ 匹配行首$ 匹配行尾[] 集合,匹配集合中任意单个字符[^] 对集合取反\{n,m\} 匹配前一个字符n到m次\{n\} 匹配前一个字符n次\{n,\} 匹配前一个字符n次及n次以上\(\) 保留
扩展正则+ 最少匹配一次? 最多匹配一次{n,m} 匹配n到m次() 保留| 或者\b 单词边界
sed基本用法
用法1:前置命令 | sed [选项] ‘条件指令’
用法2:sed [选项] ‘条件指令’ 文件...常用选项:-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)-r(让sed支持扩展正则)-i(让Sed直接修改源文件,默认sed只是通过内存临时修改文件,源文件无影响)
打印(p):sed -n ‘条件’ 文件第2行:2p2~5行:2,5p2和5行:2p;5p第2以及后面的5行:2,+5p奇数行:1~2p偶数行:2~2p包含root的行:/root/p##/正则/p$=:输出文件的行数
删除(d):2~5行:2,5d包含root的行:/root/d不包含root的行:/root/! #!符号表示取反文件的最后一行:$dsed '$d' a.txt
替换(s/old/new/option):每行中第一个aaa替换为AAA:s/aaa/AAA每行中的第3个aaa替换为AAA:'s/aaa/AAA/3'所有的aaa替换为AAA:s/aaa/AAA/g'所有的aaa都删除:s/aaa//g a.txt #替换为空字符串将第4~7行注释掉:4,7s/^/#/ #行首加#号解除以#an开头的行的注释:s/^#an/an/' #去除行首的#号替换操作的分割“/”可改用其他字符,如#、&等,便于修改文件路径删除文件中每行的第二个、最后一个字符:s/.//2;s/.$//第1个字符、中间的所有字符、倒数第1个字符 三个部分,然后通过替换操作重排顺序为“3-2-1” s/(^.)(.*)(.$)/\3\2\1/
sed多行文本处理i:在指定的行之前插入文本a:在指定的行之后追加文本c:替换指定的行在第二行后面,追加xx:2a xx在第二行前面,插入xx:2i xx将第二行替换为xx:2c xx
awk
格式:awk [选项] ‘[条件]{指令}’ 文件
选项:-F 可指定分隔符(默认将空格、制表符等作为分割符)
指令:print (print是最常用的编辑指令,过滤)打印文档的第1列和第3列:awk '{print $1,$3}' test.txt
awk常用内置变量:$0 文本当前行的全部内容$1 文本的第1列$2 文本的第二列$3 文本的第三列,以此类推NR 文件当前的行号NF 文件当前行的列数(有几列)
awk的print指令不仅可以打印变量。还可以打印常亮示例:awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
使用数字/字符串比较设置条件比较符号:==(等于) !=(不等于)>(大于) >=(大于等于)<(小于) <=(小于等于)示例:awk -F: '$3>=1000{print $1,$3}' /etc/passwdawk -F: '$1=="root" /etc/passwd
逻辑测试条件:逻辑符号:&&(逻辑且) ||(逻辑或)示例:awk -F: '$3>10 && $3<20' /etc/passwdawk -F: '$3>1000 || $3<10' /etc/passwd
数学运算:运算符号:+ - * / %示例:awk 'BEGIN{print 2+3}'awk 'BEGIN{x++;print x}'awk 'BEGIN{x=8;print x+=2}'awk 'BEGIN{print 2*3}'
awk [选项] 'BEGIN{指令}{指令}END{指令}' 文件BEGIN{}:行前处理,读取文件内容前执行,指令执行1次{}:逐行处理,读取文件过程中执行,指令执行n次END{}:行后处理,读取文件结束后执行,指令执行1次示例:awk 'BEGIN{A=24;print A*2}'awk 'BEGIN{print x+1}' #x可以不定义,直接用,默认值为0awk 'BEGIN{x=0}/bash$/{x++}END{print x}' /etc/passwd #统计系统中使用bash作为登录shell的用户总个数
awk流程控制(if分支、awk数组)if分支结构(单分支、双分支、多分支)单分支示例:awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd #统计/etc/passwd文件中UID小于或等于1000的用户个数双分支示例:awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd #分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数多分支示例:awk -F: '{if($3<10){i++}else if($3>50){j++}else{k++}}END{print i,j,k}' /etc/passwd #分别统计/etc/passwd文件中UID小于10、大于50、在10~50之间的用户个数
awk数组相当于可以存储多个值得特殊变量定义数组的格式:数组名[下标]=元素值示例:awk 'BEGIN{a[0]++;print a[0]}'调用数组的格式:数组名[下标]示例:awk 'BEGIN{a[0]=11;a[1]=88;print a[0],a[1]}'在awk中利用for循环遍历数组(显示数组所有内容)for循环基本格式 for(变量名 in 数组名){执行指令}awk 'BEGIN{abc["a"]="aaa";abc["b"]="bbb";abc["c"]="ccc";for(i in abc){print i,abc[i]}}'准备素材test,将其内容交给awk利用数组加for循环统计不同的行有多少,分别出现了几次[root@abc opt]# cat testabcxyzopqabcabcxyzawk '{a[$1]++}END{for(i in a){print i,a[i]} }' test编写脚本,找到尝试登录服务器大于等于5次的人的ip发邮件给管理员#!/bin/bashx=$(awk '/Failed password/{ip[$11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure |awk '$1>=5') [ -z "$x" ] && exitecho "有人尝试登录服务器,信息是$x" | mail -s test root
shell脚本、awk、sed用法相关推荐
- shell脚本之echo用法
shell脚本之echo用法 1.echo常见转义符号 符号 功能描述 \b 退格键(backspace) \f 换行但光标仍停留在原来的位置 \n 换行且光标移至行首 \r 光标移至行首但不换行 \ ...
- shell脚本中的$用法
shell脚本中的$用法 变量 含义 $0 shell脚本的文件名 $1 ~ $n 添加到shell脚本中的各参数: 即执行shell脚本时后跟的内容: $1为第1参数,$2为第2参数 $? shel ...
- 详解Shell脚本:sed命令工具 ,awk命令工具
-----------------------------概述----------------------------------- Linux文本处理工具(以下都是命令和工具,而且只是作为展示,不能 ...
- shell学习之-sed用法解析_Shell脚本之sed的使用
1.sed命令:主要作用是查找:新增 删除 和修改替换. user.txt daokr#cat user.txt ID Name Sex Age zhang M 19 wang G 20 cheng ...
- shell脚本常用语句用法笔记
脚本基本语句用法笔记 grep -i 查询时不区分大小写 -n打印匹配的行号 -v 打印不匹配的行 -AX包括每次匹配之后X行 -BX包括每次匹配之后X行 cat /etc/passwd |grep ...
- Shell脚本中$的用法
2019独角兽企业重金招聘Python工程师标准>>> $0: 脚本名称,相对路径还是绝对路径要看调用的方式.如果是在父目录中,./dollarTest.sh调用,那么$0就是 ./ ...
- shell脚本的一些用法笔记
1.在一般命令窗口输入的命令直接拷贝到脚本文件中就可以执行. 2.判断文件或文件夹是否存在.具有执行权力等.[改写自网络] #!/bin/shNovaPath="/var/log/httpd ...
- shell脚本之case用法
你会经常发现自己在尝试计算一个变量的值,在一组可能的值中寻找特定值.在这种情形下, 你不得不写出很长的if-then-else语句,就像下面这样. $ cat test25.sh#!/bin/bash ...
- shell脚本——awk详细介绍(包含应用案例)
三剑客awk详解 awk概述 awk处理文本方式 awk工作原理 awk语法 汇总示例 内部变量 格式化输出 模式(正则表达)和动作 概念 字符串比较 数值比较 目的 关系运算符 算术运算 多条件运算 ...
- 【shell】shell脚本实战-sed流编辑器
文章目录 sed的介绍 sed的执行过程 sed的用法 sed常用选项 实战案例 1. 将 passwd中root替换为zmgaosh 2. 按行查找替换 1)单行替换: 2)多行替换: 3)删除2- ...
最新文章
- 计算机视觉 | YOLO开源项目汇总
- Linux下安装Oracle参数自动初始化脚本
- 如何取消掉计算机更新图标,XP系统如何关闭右下角中的自动更新图标?
- 怎么建立微信生态用户增长模型?
- Asp.Net Core Blazor之容器部署
- java setsize_Java Vector setSize()方法与示例
- qdialog 返回值_QDialog exec()并获取结果值
- .net core + headless chrome实现动态网页爬虫
- 刷爆了!国企33岁程序员年入40w,直言:想降薪进阿里钻研技术
- 【linux命令】tar命令
- 师从施一公,4年8篇CNS,作为西湖大学博士后,她又以一作发了Science
- U盘文件数据恢复工具如何使用
- 看山不是山,看水不是水
- 山寨新浪微博——TabBarController
- appinventor计算机教程,App Inventor编程开发集锦2-计算器-第2课-实现常规操作
- bilibili老版本_bilibili网页版下载
- 谷歌浏览器崩溃,无法搜索
- 区块链技术运用在票据领域-票据链
- 一款百度网盘不限速下载神器
- 加油站优惠券组合方式
热门文章
- 系统集成项目管理工程师-法律法规与标准规范
- 小米手机扩容教程_手机内部存储空间扩容方法
- java将邮件保存到本地文件夹_JavaMail 邮件文件夹管理
- 【深度思考,极客大学Java进阶训练营
- linux 防火墙 443端口映射,linux防火墙实现端口转发、端口映射及双向通路
- 触控手机、握笔握手、拎箱包、拿鸡蛋 可穿戴仿生手将投入量产!
- 浪漫主义和革命英雄主义的回忆
- 爬虫实例5:使用scrapy框架获取链家网二手房最新信息(获取单个城市所有街区二手房信息可以使用selenium动态获取页数)
- 禅与摩托车维修艺术_摩托车与编程之禅
- 高德地图-初始化地图