找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 294|回复: 0

shell中的字符串截取

[复制链接]

205

主题

173

回帖

6925

积分

论坛元老

积分
6925
发表于 2013-6-5 09:54:50 | 显示全部楼层 |阅读模式
在shell中遇到字符串问题,首先考虑的是grep ,sed ,awk , cut
不先讲这几个命令了,先来看一下字符串截取中用简单方法就能做到的事情 ${}(1)shell中的单引号比双引号的区别:单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略
(2)求字符串长度  ----- (1)expr $x:‘.*’(2)${#x}
(3)求字符串子串  ----- ${xposlen},其中$pos位置,$len长度,其中$len可省略
(4)字符串替换    ----- ${x/a/b} 用b替换a ; ${x//a/b}用b替换所有的a
(5)字符串首尾截取----- ${x##*/}去掉所有/左边的字符,也可用其它匹配代替*/  ${x#*/}只去掉第一次出现/左边所有的字符,顺序为从左到右;${x%%/*}去掉所有/右边的字符,${x%/*}去掉第一次出现/右边的字符,顺序为从右到左.eg,
#!/bin/bash
y=kdjfkd:dfkdjfkd:8888:9899899:kdjfkdfj
q=`echo $y | cut -d":" -f4` //以:截取,取第四个字段即9899899
m=${q##*8} //去掉所有8左边的字符
echo $m
n=${q#*8} //去掉第一个8左边的字符
echo $n
result:99
          99899


(6)Shell数组定义 a=(1 2 3 4),不能有空格,比如a =(1 2 3 4)和a=(1 2 3 4)都是不允许的。
(7)数组长度: ${#a[@]}或者 ${#a
  • } ;全部数组 ${a[@]}或{$a
  • }返回1 2 3 4
    (8)数组元素的长度   ${#a},i为下标,和其它语言一样,从0开始,数组元素${a}
    (9)awk默认使用空格作为域分隔符,
    "+"和"?"只适用awk而不适用sed和grep
    awk条件操作符:<,<=,>=,==,!=,~,!~
    awk字符串处理函数:gsub(r,s),gsub(r,s,t),index(s,t)等
    awk自定义环境变量:FILENAME,FNR,FS,NF,NR等
    awk -F : &#39;{print $1}&#39; /etc/passwd 打印第一列的值, $0 打印全部的值
    awk -F : &#39;BEGIN {print "name       passwd\n-----------------"} {print $1"\t"$5}&#39;END {print "End of file"}&#39; /etc/passwd 输出增加头尾
    awk &#39;{if($0~/root/) print $0}&#39; /etc/passwd输出匹配"root"的行,等价于awk &#39;$0~/root/&#39; /etc/passwd
    (10)无论命令是什么?sed并不与初始化文件打交道,它操作的只是文件的一个拷贝。如果不重定向到一个文件,直接在标准输出(显示屏)显示。
    搜索替换是sed的拿手好戏。
    sed -n &#39;1,$p&#39; /etc/passwd 打印从1到最后一行的所有内容
    sed -e &#39;/root/=&#39; /etc/passwd打印出现"root"的行号和所有行
    sed -n &#39;/root/=&#39; /etc/passwd只打印行号
    sed -n -e &#39;/root/p&#39;  /etc/passwd  只打印出现"root"的匹配行
    sed -n -e &#39;/root/p&#39; -e &#39;/root/=&#39; /etc/passwd 打印匹配行和行号
    sed &#39;s/^M//g&#39; /etc/passwd 删除行尾控制字符(^M)= ctrl+v+m
    sed &#39;s/^0*//g&#39; /etc/passwd 删除行首的多个零
    (11)grep 一般用来搜索字段或字串,sed用来搜索或者替换,awk可以进行复杂的运算和定制操作
    (12)先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量
    系统变量:
    $# 传递到脚本的参数个数;
    $$脚本运行的当前进程id;
    $?最后命令的退出状态,0表成功;
    $!上一个命令的PID ;
    $@ 以"参数1" "参数2" ... 形式保存所有参数 ;
    $* 以"参数1 参数2 ... " 形式保存所有参数 ;$0表示脚本名称
    用户变量:用set命令查看
    环境变量:用setenv查看
    (13)不同的shell版本有不同数组赋值方法,而bourne shell (如bash)中不支持数组方式。
    (14)查看目录或者文件,符号链接:ls -l | grep &#39;^d&#39; 或者 ls -l | grep &#39;^-&#39;,ls -l | grep &#39;^l&#39;
    (15)查看最后一列的指:ls -l | grep &#39;^l&#39; | awk &#39;{print $NF}&#39; (默认以空格分隔),在awk中,NF表示字段数,$NF表示最后一个字段
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    果子博客
    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-2-1 13:58 , Processed in 0.072628 second(s), 20 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表