精华内容
下载资源
问答
  • shell脚本小记 ——字符串截取前言:之前一直没太认真琢磨。觉得网上有,不会的百度下。就是抱着这种态度,简单的几个...为什么不说前三种呢,我个人觉得前三个命令用来截取字符串有点高射炮打蚊子。# 号截取,删除左

    shell脚本小记 ——字符串截取

    前言:

    之前一直没太认真琢磨。觉得网上有,不会的百度下。就是抱着这种态度,简单的几个技巧现在才一知半解。

    正题

    shell脚本字符串截取我大概想到有如下几种方式:
    1. sed 
    2. awk 
    3. cut 
    4. 通过# % 截取(不知道应该叫什么方法)
    
    本文详细说明下第4种方式。为什么不说前三种呢,我个人觉得前三个命令用来截取字符串有点高射炮打蚊子。
    
    1. # 号截取,删除左边字符,保留右边字符,匹配第一个

      eg:
      var=http://www.vr7jj.com/api
      str=${var#*/}

      最后str为 /www.vr7jj.com/api

    2. ## 号截取,删除左边字符,保留右边字符,匹配最后一个

      eg:
      var=http://www.vr7jj.com/api
      str=${var##*/}

      最后str为 api

    3. % 号截取,删除右边字符,保留左边,匹配第一个

      eg:
      var=http://www.vr7jj.com/api
      str=${var%/*}

      最后str为 http://www.vr7jj.com

    4. %% 号截取,删除右边字符,保留左边,匹配最后一个

      eg:
      var=http://www.vr7jj.com/api
      str=${var%%/*}

      最后str为 http:

    5. 扩展 按位截取

      eg:
      var=http://www.vr7jj.com/api
      str1=${var:0:4} #左边第0个字符开始截3个数 结果 http
      str2=${var:7} #左边第7个字符一直到结束 结果 www.vr7jj.com/api
      str3=${var:0-15:10}#右边第15个字符开始取10位
      str4=${var:0-6}#右边第几个字符开始一直到结束

    总结:

    记忆方法 # 号脚本中用于注释常在行开头左边。所以#是从左边开发截取; %反这从右边截取。(用的少了,脑子不好使,常忘记)

    展开全文
  • shell脚本中或者terminal指令中,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部...

    前言

    在shell脚本中或者terminal指令中,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

    获取长度、读取、替换的一系列指令

    ${#string}	  				$string的长度
    ${string:position}			在$string中, 从位置$position开始提取子串
    ${string:position:length}	在$string中, 从位置$position开始提取长度为$length的子串
     
    ${string#substring}		从变量$string的开头, 删除最短匹配$substring的子串
    ${string##substring}	从变量$string的开头, 删除最长匹配$substring的子串
    ${string%substring}		从变量$string的结尾, 删除最短匹配$substring的子串
    ${string%%substring}	从变量$string的结尾, 删除最长匹配$substring的子串
     	 
    ${string/substring/replacement}		使用$replacement, 来代替第一个匹配的$substring
    ${string//substring/replacement}	使用$replacement, 代替所有匹配的$substring
    ${string/#substring/replacement}	如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    ${string/%substring/replacement}	如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    

    替换字符

    str="apple, tree, apple tree"  
    echo ${str/apple/APPLE}   # 替换第一次出现的apple  
    # 输出APPLE, tree, apple tree
    
    echo ${str//apple/APPLE}  # 替换所有apple  
    # 输出 APPLE, tree, APPLE tree
    
    echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它  
    echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它  
    

    也可以用作分割字符串处理,例如:

    str="apple, tree, apple tree"  
    echo ${str//,/APPLE}  # 替换所有apple  
    # 输出 APPLE, tree, APPLE tree
    

    分割、截取字符串

    1. 使用 # 和 ## :截取的是指定字符后边内容

    val=“hello_world_shell”
    
    echo ${val#*_}
    # 只删掉第一个 _ 前边的字符,截取剩下后边的内容
    # 输出: world_shell
    
    echo ${val##*_}
    # 删除最后一个 _ 前边的字符,只截取最后一个 _ 后边内容
    # 输出: shell
    

    这里的 * 表示的是通配符
    示例: 截取文件的后缀,去掉文件名字

    str_file="123.hello.json"
    
    echo ${str_file##*.}
    # 删掉最后一个 . 前边的123.hello
    # 输出: json
    

    2. 使用%和%%:截取的是指定字符前边内容

    val=“hello++world++shell”
    
    echo ${val%++*}
    # 删除最后一个 ++ 后边字符,截取前边剩下的内容
    # 输出: hello++world
    
    echo ${val%%++*}
    # 删除第一个 ++ 后边字符,只截取保留第一个 ++ 前边的内容
    # 输出: hello 
    

    示例 截取文件名字,去掉后缀

    str_file="123.hello.json"
    
    echo ${str_file%.*}
    # 删除最后一个 . 后边的json,截取123.hello
    # 输出: 123.hello
    

    3. 使用{:}或者${::}: 根据字符索引来截取

    val=“hello world!”
    ehco ${val:4:5}
    # 输出: o wor
    

    这个简单易懂,这里的4代表的是字符‘o’,即从左边开始算的第5个字符开始。
    5代表是截取的字符个数。所以就是从第四个字符开始,截取5个字符。


    val=“hello world!echo ${val:5}
    # 输出:world!
    

    代表的就是从左边第5个字符到最后一个字符


    val=“hello world!echo ${val:0-10:3}
    #输出:llo
    

    从右边第10个字符开始截取3个字符。

    展开全文
  • 当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。 一、sed+grep方法: 首先大概了解一下sed,sed是linux里面一个非交互性的文本流编辑器(好长的定义,反正我听起来我很

    在linux中经常要对一些动态的文本文件抽取指定的字符串,比如执行ps命令后想要获取指定的运行进程(如ps自己)的PID号(同一个进程每次启动的时候pid号是随机分配的)。该怎么办呢?当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。

    一、sed+grep方法:

    首先大概了解一下sed,sed是linux里面一个非交互性的文本流编辑器(好长的定义,反正我听起来我很拗口)。解释2点:

    1,非交互性:这里非交互性是指sed工具并不直接编辑目的文本文件,而是编辑目的文件的一个缓存拷贝,只能够修改拷贝文件,不会对源文件有任何的改动!也就是说编辑并不在目的文件现场!比如我想要编辑example.log文件,如果用vi编辑器必须直接打开example.log文件,然后在里面编辑。而sed是编辑example.log文件的一个拷贝,那么你可能要问了,这个拷贝在哪儿呢?这个拷贝在缓存里面,不需要我们自己拷贝,只要你调用了sed工具来编辑,系统自动会帮我们拷贝出一个example.log文件供你去编辑,从而保护好源文件不被随意改动。

    2,文本流:文本流是指我们通过一定的shell指令对文本进行编辑,而不想vi编辑器一样需要把文件打开之后才能够进行编辑。比如我要删除example.log里面的第一行。vi里面必须先打开文件,然后选中第一行,再按下backspace键删除。如果你使用sed命令的话,就只要执行以下一行代码就可以干脆利落的删除掉第一行:sed '1d' example.log。现在可以知道,sed工具无需打开文件再进行操作,而是通过一系列命令操作文本流,所以叫做文本流编辑器。


    好,现在来解决问题:

    举个例子,比如使用ipsec的时候经常需要使用的一个命令是setkey -D来查看spi是否正常生成了。而每次ipsec连接的时候产生的spi是不一样的,当spi产生失误的时候,就会出现spi=000000000;现在我想通过一定的shell脚本获取spi的值。setkey -D产生而定输出如下图

    我们在说sed,当然使用sed来解决该问题。

    明确一下我们的目的:我们的目的是要获取上图中的一段数据:spi=152056446,并且每次如果ipsec重新启动的时候spi后面的数据会不一样(但长度一样,并且都是数字)。那么我们想到自然要用到正则表达式来匹配该段数据,然后输出到一个变量或者文件供我们后续使用。

    再来看看sed给我们提供了什么方法:sed可以很方便的把某一行打印出来,sed -n '2p' example.log会打印出第二行。也就是说sed很容易获取行,这显然不能满足我们的需求。sed不会这么简单!sed还提供了删除,追加,插入,替换等丰富的方法来对一段文本进行编辑。

    删除某一行:

    追加:把hello,i was appended here 追加到有national这一行的的后面。

    替换:sed 's/source string/destination string/' example.log


    那么,我想既然sed可以非常方便的获取到某一行数据,而它又能够对文本进行编辑,那么,我的想法是,先用sed对文本进行一定的编辑,把目标字符串编辑到某一行内,我就非常方便的获取到了


    好,照着这条思路走:

    1,编辑文本,把目标字符串放到单独的一行里面来:观察之后可以看出,该段目的字符串spi=152056446(0x0910327e)前后都有空格,那么就用空格作为重新编辑的标记位,前后换行。

    输入命令:sed 's/ /\n/g' example.log。解释下命令,s是替换的标记,第一个/ /里面有一个空格,意思是查找所有含有空格的行,最后的g表明要对该行的所有空格进行查询,而不只是查询到第一个就查询下一行,第二个/\n/是一个换行符,结合前面的空格查询语法,可以对所有的空格替换成换行符。里面的命令执行后会把文本重新编排,遇到空格就换行,这样,目标字符串就已经到了单独的一行里面去了!!!

    2,获取目标行字符串:现在就很简单了,我们可以用grep来获取(grep "spi" example.log),也可以用sed来获取(sed '/spi/p' example),把屏幕输出重定向到一个文件里面去,或者赋给一个变量,这样,我们抽取目标字符串的任务就完成了!!!

    是不是很简单!!!大笑好,下面来看awk方法

     

    二、awk方法:

    同样的,首先来大概了解一下awk方法的精髓,awk方法主要是对文本进行“列”的操作,这个对比一下sed和grep可能我们更容易理解一些,sed和grep主要是对文本进行“行”的操作,awk会把每一列都取一个名字,从第一列开始:分别为$1,$2...$n,好吧,这样就可以按照名字来分别操作列了。

    好吧,现在我们来实例操作一下。

    我们从ps输出里面去查询指定进程名字的PID,在我的终端直接输入ps x之后会显示当前进程的名字,其部分截图如下:

    现在我想获取的是当前ps x输出里面的进程名为上图中红圈部分nautilus的PID值1355,由于相同进程会在不同的时候开启的时候所获取到的PID号不一样,所以当前的PID值1355其实是个不一定的数字。于是,我们只能通过进程名字nautilus来获取当前PID。好,目的明确之后进行操作:

    1,配合使用管道,使用grep获取到包含nautilus的行:


    发现有2个nautilus,好吧,那我们就来操作2个nautilus的PID,只是需要配合使用一下sed,没事,就当复习一下;

    2,现在是awk派上用场的时候了:


    继续使用管道,可以看到,利用命令可以得到进程名为nautilus的PID列:1355和1858。

    这里先来个小插曲,简单介绍一下awk命令的语法,awk基本语法为:awk [-F] "field-operator" 'comand' inputfiles,-F和field-operator一起使用,field-operator是域分隔符,如果不使用-F选项,则默认的域分隔符为空格。后面command命令一般需要用一堆“{}”括起来,然后进行必要的操作,比较全面一点的command命令'{if($1~/^A/) print $1}',翻译一下这个命令就是,如果第一列($1)里面有匹配(~)正则表达式(/^A/)的话,那么就输出(print)到标准输出。需要注意的是,条件必须要用一堆"()"括起来,正则表达式需要用“//”括起来。当然,完全可以不要条件匹配,可以直接输出指定列,如'{print $1}'。好,awk就介绍到这里,不过awk是一个非常非常强大的文本格式化抽取的工具,需要专门的学习。后面我再写一个关于awk学习的总结。

    3,现在需要利用sed对"行"的操作了,我们获取到的第一行就是第一个nautilus的PID值,上面我们已经介绍了sed命令,所以很简单的,接着上面的管道,输入以下命令:


    很快,我们就可以得到第一个nautilus的PID值了大笑

    是不是很简单,就简单的三部操作,grep——awk——sed,这三真是文本操作里面的拼命三郎啊



    三、现在来稍微介绍一下cut方法

    cut也是一个比较强大的工具,可以对一行字符串进行多种模式匹配的剪切操作,也可以对一个排列非常整齐的文本进行操作,下面通过2个例子来大致说明 一下cut的操作。

    1,先说明cut对一行字符串的操作:

    在终端执行echo $PATH命令,可以获得当前默认的bash路径,如下图:


    其中每一个路径都被一个“:”分隔开来,现在我想获取第1个和第2个冒号之间的路径,使用cut将会非常之方便,在终端输入命令:


    确实,我们获取到了第一个冒号与第二个冒号之间的字符串“/usr/local/bin”,现在来稍微解析一下这条命令,-d和':'一起把管道输入的一行字符串进行了域的分隔,每一个分隔符(在这里是个冒号“:”)前面的字符串被称为一个域,若有n个分隔符,这个域的编号则从1开始到n+1,第1个分隔符前面的字符串为第一个域。这个域对应在该命令行则是-f后面的数字2,所以该命令`cut -d ':' -f 2`表达的意思是输出第二个分隔符“:”之前的域。

    如果我们执行

    或者是cut -d ':' -f 2-4,则可以输出第2个和第四个域的字符串,但是还多了一个分隔符,这点我也没搞懂。

    上面是是用分隔符对一行字符串进行操作,下面我们队字符串的每一个字母当成一个数组里面的元素,只是第一个元素是从1开始,而不是传统数组的0开始。这样可以进行另外一种cut操作,现在先定义一个字符串变量,并从中截取出1-5之间的字符:


    可见,这条命令很好的把字符串“hello world”从第2个字母到第5个字母cut了下来,把最后的参数进行一下修改,如下:


    则可以截取到第2个字符以及后面的所有的字符。

    2,cut对格式化整齐的文本进行操作:

    这是一段格式化比较整齐的数据,每一行前面的“declare -x”都是一模一样的,我现在想把这一段给去掉:


    其实我们发现对该文本的操作跟上的一行字符串的操作没什么区别。


    那么就验证一下对分隔符的操作是否也一样:

    发现结果确实是一样。这说明cut会把一个文本里面的每一行都独立的对待,然后再操作。


    展开全文
  • shell脚本字符串截取

    千次阅读 2013-09-06 08:43:52
    shell字符串的截取的问题: 一、Linux shell 截取字符变量的前8位,有方法如下:  1.expr substr “$a” 1 8  2.echo $a|awk ‘{print substr(,1,8)}’  3.echo $a|cut -c1-8  4.expr $a : ‘\(....

    shell字符串的截取的问题:

    一、Linux shell 截取字符变量的前8位,有方法如下:

      1.expr substr “$a” 1 8

      2.echo $a|awk ‘{print substr(,1,8)}’

      3.echo $a|cut -c1-8

      4.expr $a : ‘\(.\\).*’

      5.echo $a|dd bs=1 count=8 2>/dev/null

    二、按指定的字符串截取

      1、第一种方法: ${varible##*string} 从左向右截取最后一个string后的字符串 ${varible#*string}从左向右截取第一个string后的字符串 ${varible%%string*}从右向左截取最后一个string后的字符串 ${varible%string*}从右向左截取第一个string后的字符串 “*”只是一个通配符可以不要

    例子: $ MYVAR=foodforthought.jpg $ echo ${MYVAR##*fo} rthought.jpg $ echo ${MYVAR#*fo} odforthought.jpg

      2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

    可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行: $ EXCLAIM=cowabunga $ echo ${EXCLAIM:0:3} cow $ echo ${EXCLAIM:3:7} abunga

    这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

    三、按照指定要求分割: 比如获取后缀名 ls -al | cut -d “.” -f2

     一、构造字符串
    直接构造 STR_ZERO=hello STR_FIRST="i am a string" STR_SECOND='success'
    重复多次 #repeat the first parm($1) by $2 times strRepeat() { local x=$2 if [ "$x" == "" ]; then x=0 fi
    local STR_TEMP="" while [ $x -ge 1 ]; do STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"` x=`expr $x - 1` done echo $STR_TEMP }
    举例: STR_REPEAT=`strRepeat "$USER_NAME" 3` echo "repeat = $STR_REPEAT"
    二、赋值与拷贝
    直接赋值 与构造字符串一样 USER_NAME=terry
    从变量赋值 ALIASE_NAME=$USER_NAME
    三、联接
    直接联接两个字符串 STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"` 使用printf可以进行更复杂的联接
    四、求长
    求字符数(char) COUNT_CHAR=`echo "$STR_FIRST" | wc -m` echo $COUNT_CHAR
    求字节数(byte) COUNT_BYTE=`echo "$STR_FIRST" | wc -c` echo $COUNT_BYTE
    求字数(word) COUNT_WORD=`echo "$STR_FIRST" | wc -w` echo $COUNT_WORD
    五、比较
    相等比较 str1 = str2
    不等比较 str1 != str2
    举例: if [ "$USER_NAME" = "terry" ]; then echo "I am terry" fi
    小于比较 #return 0 if the two string is equal, return 1 if $1 < $2, else 2strCompare() { local x=0 if [ "$1" != "$2" ]; then x=2 localTEMP=`printf "%s\n%s" "$1" "$2"` local TEMP2=`(echo "$1"; echo "$2") |sort` if [ "$TEMP" = "$TEMP2" ]; then x=1 fi fi echo $x }
    六、测试
    判空 -z str
    判非空 -n str
    是否为数字 # return 0 if the string is num, otherwise 1 strIsNum() { local RET=1 if [ -n "$1" ]; then local STR_TEMP=`echo "$1" | sed 's/[0-9]//g'` if [ -z "$STR_TEMP" ]; then RET=0 
    fi fi echo $RET }
    举例: if [ -n "$USER_NAME" ]; then echo "my name is NOT empty" fi
    echo `strIsNum "9980"`
    七、分割
    以符号+为准,将字符分割为左右两部分 使用sed 举例: 命令 date --rfc-3339 seconds 的输出为 2007-04-14 15:09:47+08:00 取其+左边的部分 date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g' 输出为 2007-04-14 15:09:47 取+右边的部分 date --rfc-3339 seconds | sed 's/.*+//g' 输出为 08:00
    以空格为分割符的字符串分割 使用awk 举例: STR_FRUIT="Banana 0.89 100" 取第3字段 echo $STR_FRUIT | awk '{ print $3; }'
    八、子字符串
    字符串1是否为字符串2的子字符串 # return 0 is $1 is substring of $2, otherwise 1 strIsSubstring() { local x=1 case "$2" in *$1*) x=0;; esac echo $x }

     

    在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

     

    一、判断读取字符串值

    表达式 含义
    ${var} 变量var的值, 与$var相同
       
    ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
       
    ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
       
    ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
    ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
       
    ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
    ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
       
    ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
    ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

    加入了“*”  不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

    [chengmo@localhost ~]$ echo ${abc-'ok'} ok [chengmo@localhost ~]$ echo $abc

    [chengmo@localhost ~]$ echo ${abc='ok'} ok [chengmo@localhost ~]$ echo $abc ok

     

    如果abc 没有声明“=" 还会给abc赋值。

    [chengmo@localhost ~]$ var1=11;var2=12;var3= [chengmo@localhost ~]$ echo ${!v@}            var1 var2 var3 [chengmo@localhost ~]$ echo ${!v*} var1 var2 var3

     

    ${!varprefix*}与${!varprefix@}相似,可以通过变量名前缀字符,搜索已经定义的变量,无论是否为空值。

     

    二、字符串操作(长度,读取,替换)

    表达式 含义
    ${#string} $string的长度
       
    ${string:position} 在$string中, 从位置$position开始提取子串
    ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
       
    ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
    ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
    ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
    ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
       
    ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
    ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
    ${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    ${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
       

    说明:"* $substring”可以是一个正则表达式.

     

    1.长度

    [web97@salewell97 ~]$ test='I love china' [web97@salewell97 ~]$ echo ${#test} 12

    ${#变量名}得到字符串长度

     

    2.截取字串

    [chengmo@localhost ~]$ test='I love china' [chengmo@localhost ~]$ echo ${test:5}     e china [chengmo@localhost ~]$ echo ${test:5:10} e china

    ${变量名:起始:长度}得到子字符串

     

    3.字符串删除

    [chengmo@localhost ~]$ test='c:/windows/boot.ini' [chengmo@localhost ~]$ echo ${test#/} c:/windows/boot.ini [chengmo@localhost ~]$ echo ${test#*/} windows/boot.ini [chengmo@localhost ~]$ echo ${test##*/} boot.ini

    [chengmo@localhost ~]$ echo ${test%/*} c:/windows [chengmo@localhost ~]$ echo ${test%%/*}

    ${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。

    ${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。

    注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法。

    4.字符串替换

    [chengmo@localhost ~]$ test='c:/windows/boot.ini' [chengmo@localhost ~]$ echo ${test/\//\\} c:\windows/boot.ini [chengmo@localhost ~]$ echo ${test//\//\\} c:\windows\boot.ini

     

    ${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。

    三、性能比较

    在shell中,通过awk,sed,expr 等都可以实现,字符串上述操作。下面我们进行性能比较。

    [chengmo@localhost ~]$ test='c:/windows/boot.ini'                       
    [chengmo@localhost ~]$ time for i in $(seq 10000);do a=${#test};done;           

    real    0m0.173s user    0m0.139s sys     0m0.004s

    [chengmo@localhost ~]$ time for i in $(seq 10000);do a=$(expr length $test);done;      

    real    0m9.734s user    0m1.628s

    速度相差上百倍,调用外部命令处理,与内置操作符性能相差非常大。在shell编程中,尽量用内置操作符或者函数完成。使用awk,sed类似会出现这样结果。
    展开全文
  • awk在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具...Shell 脚本,完成各种自动化配置任务。 AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Pet...
  • Linux 使用 shell 脚本处理字符串

    千次阅读 2020-12-08 16:34:41
    1. 截取字符串的前8位 expr substr "$string" 1 8 echo $string | awk '{print substr(,1,8)}' echo $string | cut -c1-8 echo $string | dd bs=1 count=8 2>/dev/null 2. 分割、替换字符串 2.1 命令说明 ...
  • 1.取字符长度 var="abcdef" echo ${#var} echo ${var} | awk '{print length($0)}' echo ${var} | awk -F &...2.截取字符串 假设有变量 var=http://www.aaa.com/123.htm. 注:(左边的第一个字符是用 0 表...
  • Shell字符串截取一、Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 82.echo $a|awk ‘{print substr(,1,8)}’3.echo $a|cut -c1-84.echo $5.expr $a : ‘(.\).*’6.echo $a|dd bs=1 count...
  • 1. 截取字符串的前8位expr substr "$string" 1 8echo $string | awk '{print substr(,1,8)}'echo $string | cut -c1-8echo $string | dd bs=1 count=8 2>/dev/null2. 分割、替换字符串2.1 命令说明符号释义*...
  • 1、采集sflow数据脚本 通过sflowrt解析sflow报文,然后通过sflowrt接口json数据获取需要的监控值。 #!/bin/sh curl_result=`curl http://localhost:8008/metric/10.0.2.4/json 2>/dev/null` fiter_str=$1 result...
  • 最近使用:iwconfig wlan0 | sed 's/ /\n/g' | grep -i mode //查看wlan0模式 原理:先以空格为通配符,并将其替换...当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。 一、sed+grep方法...
  • 一、Linux shell 截取字符变量的前8位,有方法如下: 1.expr substr “$a” 1 8 2.echo $a|awk ‘{print substr(,1,8)}’ 3.echo $a|cut -c1-8 4.echo $ 5.expr $a : ‘\(.\\).*’ 6.echo $a|dd bs
  • 利用shell命令取本机ip地址 cat /etc/sysconfig/network-scripts/ifcfg...利用shell脚本数组,定义一个模板文件,脚本里面引用这些变量,使用sed -i 替换,生成区配置文件 [root@localhost conf2]# cat xxx# serv...
  • 当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。一、sed+grep方法:首先大概了解一下sed,sed是linux里面一个非交互性的文本流编辑器(好长的定义,反正我听起来我很拗口)。解释2点...
  • 涉及知识点:grep字符串查找,awk截取列,until条件操作,sed字符串插入,变量与字符串连接等。 人工操作(首先vim打开文件找到字符串所在的位置,插入操作): 1 2 3 4 5 6 vim/etc/glance/glance-api-...
  • 在linux中经常要对一些动态的文本文件抽取指定的字符串,比如执行ps命令后想要获取指定的运行进程(如ps自己)的PID号(同一...当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。 一、sed
  • 当然,可以用一些截取字符串的方法,这里介绍一下用2种方法来解决这类问题。 一、sed+grep方法: 首先大概了解一下sed,sed是linux里面一个非交互性的文本流编辑器(好长的定义,反正我听起来我很拗口)。解释...
  • 当然也可以用awk命令来分隔,截取到同样的字符串 但是当一个文件中每一行都含有一个或多个空格时,这时候只能用awk来分隔,例如: 2.语法格式不同 cut [选项] 文件名 · 选项可以为: -f 列号 : 提取第几列...
  • shell awk正则式匹配问题

    万次阅读 2013-08-14 10:51:29
    今天看到个shell脚本里面awk处理字符串的,里面有一句gsub("\\.[0-9]+$","",$2),而这个$2的格式是2013-08-07 00:12:13.333这种,这个gsub想要把.333给去掉,看着不太正常,感觉里面的正则式应该是匹配不到.333的啊...
  • shell script 经验笔记

    2017-03-04 20:42:58
    linux经验笔记 一、sed 二、AWK 三、sort 命令 四、shell——if 五、shell——截取字符串 六、shell——单引号和双引号 七、grep 八、简单的shell脚本 九、shell 函数 自定义回收站
  • 牛客shell练习

    2021-03-13 16:36:32
    文章目录awk内置函数splitsubstr 截取字符串length 字符串长度gsub 使得所有正则表达式被匹配的时候都发生替换牛客shell练习写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数末尾查看写一个 bash脚本以输出...
  • 1.1. 字符串操作 1.1.1. 剔除字符串 1.1.2. 字符串比较 2. shell命令 2.1. 查找 & 截取 2.1.1. find 2.1.2. grep 2.1.3. xargs命令 2.2. 输出 2.2.1. awk 2.2.2. echo 3. 路径 3.1. 当前路径 3.2...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

shell脚本awk截取字符串