Shell字符串操作

1. 字符串的长度,例如:
* $ var="get the length of me"
$ echo ${#var}
20
* $ expr length "$var" #注意这里是双引号
20
* $ echo $var | awk ‘{printf("%d",length($0))}‘
20
* $ echo -n $var | wc -c # echo每次输出时,会自动的输出换行符,-n表示部署出那一个换行符
20
 
2. 获取字符串中,某些字符的个数,例如
* $ echo $var | tr -cd g | wc -c
2
$ echo -n $var | sed ‘s/[^g]//g‘ | wc -c
2
$ echo -n $var | sed ‘s/[^gt]//g‘ | wc -c
5
 
3. 统计单词的个数
* $ echo $var | wc -w
 
4. bash提供的数组数据结构,它是以数字为下标的,和C语言从0开始的下一样:
* $ var="get length of me"
$ var_arr=($var) #这里把var字符串,以数组的形式存放到var_arr中,默认以空格分割
$ echo ${var_arr[0]} ${var_arr[1]} ${var_arr[2]} ${var_arr[3]} ${var_arr[4]}
get the length of me
$ echo ${var_arr[@]} #@表示整个字符串
get the length of me
$ echo ${var_arr[*]} #*表示整个字符串
get the length of me
$ echo ${#var_arr[@]}#求得整个字符数组的元素个数
5
$ echo ${#var_arr[0]}#求得某个字符串的字符个数
3
$ var_arr[5]="new_element" #直接给数组元素赋值
$ echo ${var_arr[@]}
get the length of me new_element
$ echo ${#var_arr[@]}
6
* $ for i in $var; do echo $i" "; done;
get the length of me
 
5. awk里面的数组:
* echo $var | awk ‘{printf("%d %s\n",split($0,var_arr," "),var_arr[1])}‘
split把字符串按照空格分割,存放到var_arr中,并返回数组的长度,注意,这里第一个元素的下标不是0,而是1。
* awk把一行按照空格分成若干个域,并用$1,$2,$3...来引用,$0表示整行,NF表示该行域的总数。
* echo $var | awk ‘{split($0,var_arr," ");for(i in var_arr) printf("%s ",var_arr[i]);}‘
这里的for循环中,循环变量为下标
* echo $var | awk ‘{split($0,var_arr," ");delete var_arr[1]}‘
删除第一个数组元素
 
6. 取子串
* $ var="get length of me"
$ echo ${var:0:3}
get
$ echo ${var(-2)} #反方向
me
$ echo `expr substr "$var" 5 3`
the
$ echo $var | awk ‘{printf("%s\n",substr($0,9,6))}‘ #从第九个位置开始选取6个字符
length
* 使用cut取子串
$ echo $var | cut -d " " -f 5
me
* $ echo $var | sed ‘s/ [a-z]*//g‘
get
删除空格+字母串
$ echo $var | sed ‘s/[a-z]* //g‘
me
删除字母串+空格
 
7. 匹配求子串
* $ echo ${var%% *} #从最右边开始,删除最左边空格右边的所有字符
get
* $ echo ${var% *} #从最右边开始,删除第一个空格右边的所有字符
get the length of
* $ echo ${var##* } #从最左边开始,删除最右边空格左边的所有字符
me
* $ echo ${var#* } #从最左边开始,删除第一个空格左边的所有字符
the length of me
 
8. sed有按行打印的功能,记得用tr把空格换为行号
* $ echo $var | tr " " "\n" | sed -n 5p
me
* $ echo $var | tr " " "\n" | sed -n 1p
get
 
9. tr来取子串
* $ echo $var | tr -d " "
getthelengthofme
* $ echo $var | tr -cd "[a-z]" #仅仅保留字母
getthelengthofme
 
10. head和tail
* $ echo "abcdefghijk" | head -c 4
abcd
* $ echo "abcdefghijk" | tail -c 4
hijk
 
11. 查询字串
* $ var="get the length of me"
$ expr index "$var" t
3
* $ echo $var | awk ‘{printf("%d\n",match($0,"the"));}‘
5
 
12. 子串替换
* $ var="get the length of me"
$ echo ${var/ /_} #把第一个空格替换成下划线
get_the length of me
$ echo ${var// /_} #把所有的空格都替换成下划线
get_the_length_of_me
$ echo $var | awk ‘{sub(" ","_",$0);printf("%s\n",$0);}‘
get_the length of me
$ echo $var | awk ‘{gsub(" ","_",$0);printf("%s\n",$0);}‘
get_the_length_of_me
$ echo $var | sed ‘s/ /_/‘
get_the length of me
$ echo $var | tr " " "_"
get_the_length_of_me
$ echo $var | tr "[a-z]" "[A-Z]"
GET THE LENGTH OF ME
 
13. tac 会将文本的内容倒置显示,正如名字和 cat 相反一样,
功能和cat也是相反的
 
14. 插入子串
* $ var="get the length of me"
$ echo ${var/ /_ } #在第一个空格前加上_
get_ the length of me
$ echo ${var// /_ } #在所有的空格前都加上_
get_ the_ length_ of_ me
$ echo ${var/ / _}
get _the length of me
$ echo ${var// / _} #在所有的空格之后都加上_
get _the _length _of _me
 
* $ echo $var | sed ‘s/\( \)/\1_/‘ #在第一个空格之后加上_
get _the length of me
$ echo $var | sed ‘s/\( \)/\1_/g‘
get _the _length _of _me
$ echo $var | sed ‘s/\([a-z]*\) \([a-z]*\)/\2 \1/‘ #调换get和the的位置
the get length of me
 
15. 删除子串
* $ var="get the length of me"
$ echo ${var// /}
getthelengthofme
 
* $ echo $var | awk ‘{gsub(" ","",$0);printf("%s",$0);}‘
getthelengthofme
 
* $ echo $var | sed ‘s/ //g‘
getthelengthofme
 
* $ echo $var | tr -d " "
getthelengthofme
 
16. 子串比较使用test命令
 
17. 子串排序
* $ echo $var | tr " " "\n" | sort #正排序
get
length
me
of
the
$ echo $var | tr " " "\n" | sort -r
the
of
me
length
get
* $ cat data.txt | tr " " "\n" | sort -n
 
18. 进制转换
* $ echo "ibase=10;obase=16;10" | bc
A
 
19. 正则表达式处理url
* $ url="ftp://anonymous:[email protected]/software/scim-1.4.7.tar.gz"
$ echo $url | grep "ftp://[a-z]*:[a-z]*@[a-z0-9\./-]*" #判断url的有效性
ftp://anonymous:[email protected]/software/scim-1.4.7.tar.gz
* $ echo "$url" "$(expr index "$url" :)" | awk ‘{printf("%s\n",substr($1,1,$2-1));}‘ #截取协议
ftp
$ echo ${url%%:*}
ftp
* $ echo ${url##*@} | cut -d "/" -f 1 #截取域名
mirror.lzu.edu.cn
$ tmp=${url##*@};echo ${tmp%%/*}
mirror.lzu.edu.cn
* $ tmp=${url##*@};echo ${tmp%/*} #截取路径
mirror.lzu.edu.cn/software
* $ echo ${url##*/} #截取文件名
scim-1.4.7.tar.gz
* $ echo $url | sed ‘s/.*[0-9].//g‘ #截取文件类型
tar.gz
 
20. sed 和 awk 匹配文件中的行
* $ sed -n 7,9p README #打印README7-9行
 
21. 处理格式化的文本
* $ cat /etc/passwd | cut -d ":" -f 1,5 #截取/etc/passwd文件中的用户名和组
* $ cat /etc/group | cut -d ":" -f 1,3 #截取/etc/group文件中的组名和组id
 
22. 文件关联操作
* $ join -o 1.1,2.1 -t":" -1 4 -2 3 /etc/passwd /etc/group
#join命令用来连接两个文件,类似于数据库中两个表的连接。-t指定分隔符,
-1 4 -2 3 指定按照第一个文件的第四列和第二个文件的第三列,即组ID进行

连接,-o 1.1 2.1表示仅仅输出第一个文件的第一列和第二个文件的第一列

参考资料

============

Shell编程范例 -- by falcon

时间: 2024-10-22 05:24:33

Shell字符串操作的相关文章

linux shell 字符串操作(长度,查找,替换,匹配)详解

linux shell 字符串操作(长度,查找,替换,匹配)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${va

shell 字符串操作小结

shell 字符串操作小结 #!/bin/bash ############################################   演示bash中操作字符串的操作##   后面是输出结果########################################### str="abc123abcABC"#    |-|#    |-------| #计算字符串的长度 echo ${#str}    #12 #位置参数有关操作echo ${#*}      #位置参数

linux shell 字符串操作(长度,查找,替换)详解

原文地址:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT}

linux shell 字符串操作

转:http://justcoding.iteye.com/blog/1963463 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var}变量var的值, 与$var相同 ${var-DEFAULT}如果var没有被声明, 那么就以$DEFAULT作为其值 *

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$

Linux Shell字符串操作(长度\查找\替换)详解

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$

(正则表达式)linux shell 字符串操作(长度,查找,替换,匹配)详解

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

linux shell 字符串操作(长度,查找,替换)

感谢原创,文章很有帮助. 转自:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *     ${var=DEFAULT} 如果var

shell 字符串操作

一.环境     ubuntu14.04 x86_64 二.字符串操作     1.获得字符串长度 类似C语言中的strlen() ${#variable_name} eg: $name=zhangsan $echo ${#name} 8 $ 2.字符串提取 类似java中的substring() ${variable_name:start_index:length}    从左到右,从第start_index(0)开始,length长的子串        ${variable_name:0-s