2 shell编程
Linux下有文本处理三剑客 -- grep sed awk ?????? grep:文本 行过滤工具 ?????? sed: 文本 行编辑器(流编辑器) ?????? awk:报告生成器(做文本输出格式化) 一、正则表达式?????? 1、基础正则表达式????????????? *????? 匹配前一个字符0次或任意多次?????? (a*表示匹配前一个字符0次或任意多次,这样写没有任何意义,会匹配所有。aa*表示匹配至少包含一个a的行) ????????????? .????? 匹配除了换行符外任意一个字符 ????????????? ^ $? 行首和行尾??? ????????????? [ ]??? 中括号中任意一个字符 ????????????? {n} 表示前面的字符恰好出现n次??? 是转义符 ????????????? {n,}?????? 表示其前面的字符出现不小于 n 次 ????????????? {n,m}??? 表示前一个字符至少出现n次,最多出现m次 ?????? 2、扩展正则????????????? 不需要加转义符 ????????????? +???? 前一个字符匹配1次或任意多次 ????????????? ?????? 前一个字符匹配0次或1次 ????????????? |????? 匹配两个或多个分支选择 ????????????? ()???? 匹配一个整体 ????????????? 二、字符截取和替换命令?????? 1、cut????????????? cut 命令的默认分隔符是制表符,也就是“tab”键 ????????????? -f ?? ?列号 ????????????? -d ? 分隔符 ????????????? -c??? 字符范围 ?????? 2、awk????????????? 常见参数 ???????????????????? -F??? 指定分隔符 ???????????????????? -v??? 手动指定变量参数 ????????????? 1)printf格式化输出 ???????????????????? printf ‘输出类型输出格式’ 输出内容 ???????????????????? 输出类型:? %ns:? 输出字符串。n 是数字指代输出几个字符? ???????????????????? %ni:? 输出整数。n 是数字指代输出几个数字? ???????????????????? %m.nf:? 输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f 代表共输出 8 位数, ???????????????????? 其中 2 位是小数,6 位是整数。 ???????????????????? +右对齐 ???????????????????? -左对齐 ???????????????????? 例子: ???????????????????? 查看系统中的id大于等于1并小于等于500的用户 ???????????????????? cat /etc/passwd |awk ‘BEGIN{FS=":"} $3>=1&&$3<=500{printf "%-10s %-10dn",$1,$3}‘ ? ????????????? ????????????? 2)awk基本使用 ???????????????????? ?awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名 ??????????????? ???????????????????? ?例如:df -h|grep /dev/sda3|awk ‘{print $5}‘ ? 提取根分区占有率 ? ????????????? 3)awk的条件 ???????????????????? BEGIN???? 在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次 ???????????????????? END 在 awk 程序处理完所有数据,即将结束时执行。END 后的动作 只在程序结束时执行一次 ???????????????????? ???????????????????? >? >=?? <?? <=??? ==?? != ???????????????????? A~B ????? 判断字符串 A 中是否包含能匹配 B 表达式的子字符串 ???????????????????? A!~B ???? 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串 ???????????????????? /正则/ ???????????????????? ????????????? 4)awk的内置变量 ???????????????????? $0 ? 代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据 的,$0 就代表当前读入行的整行数据 ???????????????????? $n ? 代表目前读入行的第 n 个字段。 ???????????????????? NF?? 当前行拥有的字段(列)总数。 ???????????????????? NR?? 当前 awk 所处理的行,是总数据的第几行。 ???????????????????? FS??? 用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他 分隔符(如“:”),就需要 FS 变量定义 ???????????????????? OFS 输出字段的分隔符(默认为空格)。 ???????????????????? ?????? 例子:统计历史命令使用次数最多的 ????????????? history |awk -F ‘[ ]+‘ ‘{print $3}‘|sort|uniq -c|sort -nr|head????? ?????? 3、sed????????????? sed 主要是用来将数据进行选取、替换、删除、新增的命令 ????????????? sed [选项] ‘[动作]’ 文件名 ????????????? 选项:??? ???????????????????? -n?? 一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。 ???????????????????? -r??? 在 sed 中支持扩展正则表达式 ???????????????????? -i???? 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出 ????????????? 动作: ???????????????????? a : ???? ??追加,在当前行后添加一行或多行。添加多行时,除最后 一行外,????? 每行末尾需要用“”代表数据未完结。 ???????????????????? c :?????? ? 行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行????? 外,每行末尾需用“”代表数据未完结。? ???????????????????? i : ? 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,????? 每行末尾需要用“”代表数据未完结。? ???????????????????? d:? ???? ??删除,删除指定的行。 ???????????????????? p:??? ? ??打印,输出指定的行 ???????????????????? s:??? ? ??字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/????? 旧字串/新字串/g”(和 vim 中的替换格式类似) ? 三、字符处理命令?????? 1、sort????????????????????????????? sort [选项] 文件名 ????????????? -f:? 忽略大小写 ????????????? -b:? 忽略每行前面的空白部分 ????????????? -n:? 以数值型进行排序,默认使用字符串型排序 ????????????? -r:? 反向排序 ????????????? -u:? 删除重复行。就是 uniq 命令 ????????????? -t:? 指定分隔符,默认是分隔符是制表符 ????????????? -k n[,m]: 按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾) ?????? 2、uniq????????????? uniq [选项] 文件名 ????????????? -i: 忽略大小写 ?????? 3、wc????????????? -l: 只统计行数 ????????????? -w: 只统计单词数 ????????????? -m: 只统计字符数 ????????????? -L:统计单词字符数 四、条件判断?????? 1、按照条件进行判断????????????? test? ???????????????????? -d?? 判断目录是否存在 ???????????????????? -e??? 判断文件是否存在 ???????????????????? -f??? 判断是否为普通文件 ???????????????????? -s??? 判断文件是否为空 ? ?????? 2、按照文件权限判断???????????????????? -r ???????????????????? -w ???????????????????? -x ???????????????????? -u?? 判断是否有suid权限 ???????????????????? -g?? 判断是否有sgid权限 ???????????????????? -k??? 判断是否有sbit权限 ?????? 3、两文件之间的判断???????????????????? 文件1 -nt 文件2 判断文件 1 的修改时间是否比文件 2 的新(如果新则为真) ???????????????????? 文件 1 -ot 文件 2 ???? 判断文件 1 的修改时间是否比文件 2 的旧(如果旧则为真) ???????????????????? 文件 1 -ef 文件 2 ???? 判断文件 1 是否和文件 2 的 Inode 号一致,可以理解为两个文件是否 为同一个文件。这个判断用于判断硬链接是很好的方法 ? ?????? 4、整数判断 ???????????????????? -eq 等于 ???????????????????? -gt 大于 ???????????????????? -ge 大于等于 ???????????????????? -lt 小于 ???????????????????? -le 小于等于 ?????? ?????? 5、字符串判断 ???????????????????? -z??? 判断字符串是否为空(为空返回真) ???????????????????? -n?? 判断字符串是否为非空(非空返回真) ???????????????????? ==?? 判断字符串 1 是否和字符串 2 相等(相等返回真) ???????????????????? != 判断字符串 1 是否和字符串 2 不相等(不相等返回真) ?????? 6、多重条件判断 ???????????????????? 判断 1 -a 判断 2? ? ? ? ? 逻辑与,判断 1 和判断 2 都成立,最终的结果才为真 ???????????????????? 判断 1 -o 判断 2? ? ? ? ? 逻辑或,判断 1 和判断 2 有一个成立,最终的结果就为真 ???????????????????? !判断 ???????? 逻辑非,使原始的判断式取反 ? 五、流程控制?????? 1、单分支if????????????? if [? ];then ???????????????????? 执行体??? ?????? ? ??? fi ? ?????? 2、双分支if????????????? if [? ];then ???????????????????? 条件成立执行 ????????????? else ???????????????????? 条件不成立执行 ????????????? fi ?????? 3、多分支if????????????? if [? ];then ???????????????????? 条件成立执行 ????????????? elif [ ];then ???????????????????? 条件成立执行 ????????????? else ???????????????????? 所有条件不成立执行 ????????????? fi ? ?????? 4、多分支case条件语句????????????? case只能判断一种条件关系,而if可以判断多种 ????????????? case 变量 in ????????????? 值1) ???????????????????? 执行体 ????????????? ;; ????????????? 值2) ???????????????????? 执行体 ????????????? ;; ????????????? *) ???????????????????? 如果变量都不是以上的值,则执行此 ????????????? ;; ????????????? esac ????????????? ?????? 5、for循环????????????? for i in 条件 ; do ???????????????????? 循环体 ????????????? done????? ????????????? ????????????? for((初始值;循环控制条件;变量变化)) ????????????? do ???????????????????? 循环体 ????????????? done ?????? 6、while循环????????????? while [ 条件判断 ];do ????????????? ????????????? done (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |