shell脚本 字串截取 正则表达式
字串处理
子串截取
方法一:使用${}表达式
格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略)
方法二:使用expr substr
格式:expr substr "$x" 起始位置 长度(起始位置编号从1开始)
方法三:使用cut工具
格式:ceho $x|cut -b 起始位置-结束位置(起始位置编号从1开始)
-b:字节过滤
-c:过滤字符
-f:过滤列
示例:截取QQ1520029989
[root@ceshiji ~]# x=1520029989
[root@ceshiji ~]# echo $x
1520029989
方法一:[root@ceshiji ~]# echo ${x:0:5}
QQ152
方法二:[root@ceshiji ~]# expr substr "$x" 1 7
QQ15200
方法三:[root@ceshiji ~]# echo $x|cut -b 1-8
QQ152002
路劲分割:
取目录位置
格式:dirname "字符串"(截取文件名)
[root@ceshiji ~]# dirname /a/c/b/c.txt
/a/c/b
取文档的基本名称
格式:basename "字符串"(截取路劲)
[root@ceshiji ~]# basename /a/c/b/c.txt
c.txt
字串替换的方法:
只替换第一个匹配结果
格式:echo ${/var/old/new}
[root@ceshiji ~]# a=123456
[root@ceshiji ~]# echo ${a/3/x}
12x456
替换全部匹配结果
格式:echo ${var//old/new}
[root@ceshiji ~]# a=12345353
[root@ceshiji ~]# echo ${a//3/x}
12x45x5x
[root@ceshiji ~]# echo ${a//53/xz}
1234xzxz
——————————————————————————————————————————
字符串的掐头去尾
字符串掐头(#用来删除头部,*通配)
从左向右,最短匹配删除
格式:echo ${变量名#*关键词}
[root@ceshiji ~]# x=`head -1 /etc/passwd`(x变量=head -1 /etc/passwd命令,)
[root@ceshiji ~]# echo ${x#*:}
x:0:0:root:/root:/bin/bash
从右向左,最长匹配删除
格式:echo ${变量名##*关键词}
[root@ceshiji ~]# echo ${x##*:}
/bin/bash
字符串去尾(%用来删除头部,*通配)
从左向右,最短匹配删除
格式:echo ${变量名%关键词*}
从右向左,最长匹配删除
格式:echo ${变量名%%关键词*}
批量改扩展文件名
[root@ceshiji ~]# vim a.sh
#!/bin/bash
for i in `ls *.$1`
do
        mv $i ${i%.*}.$2
done
变量赋初始值
若变量xx已经存在且非null,则返回$xx的值
否则返回字符hydra,变量xx值不变
取值:${xx:-hydra}
[root@ceshiji ~]# echo ${b:-ok}
ok
[root@ceshiji ~]# b=1520029989
[root@ceshiji ~]# echo ${b:-ok}
1520029989
[root@ceshiji ~]# vim a.sh 
#!/bin/bash
read -p "admin:" user
read -p "pass:" pass
user=${user:-tom}
pass=${pass:-123}
useradd $user
echo "pass" |passwd --stdin $user
———————————————————————————————————
expect简介
基于TCL编写的自动交互式程序
可以用在shell脚本中,为交互式过程自动传输预先准备的文本或指令
无需人工干预,触发的依据是预期会出现的特征提示文本
但是expect不支持变量,但可以将expect内置到shell脚本中
实例:
将expect内置到shell脚本中实现ssh自动登陆,并远程执行指令
spawn:启动程序
expect:屏幕出现什么识别什么
send自动执行
[root@ceshiji ~]# vim expect.sh
#!/bin/bash
for i in 1..253
do
expect <<EOF
spawn ssh 192.168.4.$i
expect{
"yes/no"        {send "yes\r";exp_continue}
"password"      {send "Taren1"}
#               {send "mkdir /hydra\r"}
#               {send "exit\r"}
}
EOF
done
————————————————————————————————————————
正则表达式
数组:变量 [存多个值]
a=(11 22 33 xx yy)
echo ${a=[0]}(调用变量)
grep过滤命令
基本用法:
格式一:grep [选项] '正则表达式' 文件
格式二:前置命令 |grep [选项] '正则表达式'
常用命令选项:
-i:忽略字母大小写
-v:条件取反
-c:统计匹配次数
-q:静默,无任何输出(看$?返回值,为0则匹配)
-n:显示出匹配结果所在的行号
--color:标红显示匹配字串
基本正则
行首及单字匹配
类型	含义                示例		 说明
^	匹配行首            ^abc		 匹配以abc开始的行
$	匹配行尾            abc$		 匹配以abc结尾的行
.	单个字符            .			 匹配任意字符,(\n换行符除外)
+	最多匹配一次        a+或者(abc)+	 一个或多个连续的a
*	匹配任意次数        .*		        任意长度的任意字符
{}	限定匹配次数        \{n},{\n,m\},{n,}	匹配n次,匹配n-m次,至少匹配n次
[]	集合内的任何字符    [a-z]	        匹配任意小写字母
[^..]	中阔号内加^         [^123]		过滤123
\(xx\)	保留		    \(abc\)x\2		保留abc
实例:
在a.txt文件中
匹配a出现的次数
[root@ceshiji ~]# grep "a*" a.txt 
aaaa
bbasads
caascaiof
assacafca
asocnoaf
过滤有oo的字节
[root@ceshiji ~]# grep "oo" a.txt
过滤不想要oo前面有g的
[root@ceshiji ~]# grep "[^g]oo" a.txt
过滤oo前面不想有小写字母
[root@ceshiji ~]# grep "[^a-z]oo" a.txt
过滤有数字的一行
[root@ceshiji ~]# grep "[^0-9]" a.txt
过滤两个o以上的字节
[root@ceshiji ~]# grep "o\{2,\}" a.txt
扩展正则(增强,优化)
egrep
类型	含义                       示例		        说明
()	组合为整体	          ab{1,3}		匹配ab
?	最多匹配一次		  a?或者(abc)?	0个或a,0个或1个abc  
+	最少匹配一次		  a+或者(abc)+		一个或多个连续的a,一个或多个连续的abc  
——————————————————————————————————————————————————————
shell脚本 字串截取 正则表达式的更多相关文章
- Linux shell 脚本攻略之正则表达式入门
		
摘自:<Linux shell 脚本攻略> 下面是类似的解释:
 - Linux shell脚本的字符串截取
		
http://blog.csdn.net/gumanren/article/details/5601544 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.ha ...
 - Linux Shell脚本编程--字符串截取
		
Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. echo ${var#*//} ...
 - SQL字串截取函数编写及应用
		
SQL里面一种用来截取字符串的方法,用的是表函数实现字符串截取并应用的SQL操作语句中. .截取字符串表函数 ALTER FUNCTION [dbo].[SplitToTable] ( -- Add ...
 - Shell脚本编程中截取字符串方法
		
例如: 假设变量var=http://www.baidu.com/111.png 1.#号截取(删左留右) echo ${var#*//} # 号是运算符,*// 表示从左边开始删除第一个 // 号及 ...
 - 100个Linux Shell脚本经典案例(附PDF)
		
转载自:https://mp.weixin.qq.com/s/tCKAM67_7K7q2vJthaIsDQ 原文链接:https://wenku.baidu.com/view/4f089430a116 ...
 - Shell脚本并发及并发数的控制
		
https://www.jianshu.com/p/701952ffb755 正常情况下,Shell脚本是串行执行的,一条命令执行完才会执行接下来的命令.如下代码: # !/bin/bash for ...
 - 案例四:Shell脚本生成随机密码
		
生成随机密码(urandom版本) #!/bin/bash #Author:丁丁历险(Jacob) #/dev/urandom文件是Linux内置的随机设备文件 #cat /dev/urandom可以 ...
 - 100个Shell脚本——【脚本2】截取字符串
		
[脚本2]截取字符串 一.脚本 现有一个字符串如下: http://www.aaa.com/root/123.htm 请根据以下要求截取出字符串中的字符: 1.取出www.aaa.com/root/1 ...
 
随机推荐
- nodejs爬虫笔记(一)---request与cheerio等模块的应用
			
目标:爬取慕课网里面一个教程的视频信息,并将其存入mysql数据库.以http://www.imooc.com/learn/857为例. 一.工具 1.安装nodejs:(操作系统环境:WiN 7 6 ...
 - Java中的最值
			
Double.MAX_VALUE 等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE 最小正非零值 2^(-1074)Long.MAX ...
 - Python self学习
			
最开始学习Python时,用的IDE是IDEL,看的教程是<简明Python教程>,强烈推荐一下,讲得还是很不错的,适合新手学习 http://www.kuqin.com/abyteofp ...
 - java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp 问题解决方法
			
本人使用的是taglib作为模板页,然后碰到的这个问题,如果有类似的可以参考. <%@tag description="Overall Page template" page ...
 - 【原创】前端开发人员如何制作微信小程序模板
			
(我的博客网站中的原文:http://www.xiaoxianworld.com/archives/305,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 最近接触了一下微信小程 ...
 - get、post、put、delete请求方式
			
对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE. Jersey框架,实现了restful风格,常用的注解@GET.@POST.@PUT.@DELETE如 ...
 - UOJ Round #1 [数论 | DP 排列]
			
UOJ Round #1 难度很良心啊! 做出了前两题,第三题看到仙人掌就吓哭了. [UR #1]缩进优化 就是求 \[ \sum_{i=1}^n a_i - (x-1)\sum_{i=1}^n\lf ...
 - CF528D. Fuzzy Search [FFT]
			
CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...
 - php使用file_get_contents请求微信接口失败
			
windows下的php,只需要到php.ini中把extension=php_openssl.dll前面的;删掉,重启服务就可以了.Linux下的PHP,就必须安装openssl模块,安装好了以后就 ...
 - VirtualDOM与diff(Vue实现)
			
写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...