linux shell脚本编写必须会的字符串截取命令

来源:互联网 发布:js将图片转换成base64 编辑:程序博客网 时间:2024/04/28 03:01

1.cut

cut拥有三种定位方法:

1)字节(bytes)           选项 -b

2)字符(characters)  选项 -c

3)域(fields)               选项  -f


【1】当使用-b选项时,内容为多字节数据,可以添加-n选项,提示cut不将多字节拆开

【2】使用-f选项时,可以匹配-d选项,说明字符串分隔符,然后通过-f选项指定提取项


2.awk

(1)shell中的单引号比双引号的区别:单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略

  (2)求字符串长度  ----- (1)expr $x:'.*'(2)${#x}

  (3)求字符串子串  ----- ${x:$pos:$len},其中$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]},i为下标,和其它语言一样,从0开始,数组元素${a[i]}

  (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 : '{print $1}' /etc/passwd 打印第一列的值, $0 打印全部的值

  awk -F : 'BEGIN {print "name       passwd\n-----------------"} {print $1"\t"$5}'END {print "End of file"}' /etc/passwd 输出增加头尾

  awk '{if($0~/root/) print $0}' /etc/passwd输出匹配"root"的行,等价于awk '$0~/root/' /etc/passwd

3.sed

(1)当需要知道文档内容是否为制表符可以使用命令”sed -n l tab_space.txt“

(10)无论命令是什么?sed并不与初始化文件打交道,它操作的只是文件的一个拷贝。如果不重定向到一个文件,直接在标准输出(显示屏)显示。

  搜索替换是sed的拿手好戏。

  sed -n '1,$p' /etc/passwd 打印从1到最后一行的所有内容

  sed -e '/root/=' /etc/passwd打印出现"root"的行号和所有行

  sed -n '/root/=' /etc/passwd只打印行号

  sed -n -e '/root/p'  /etc/passwd  只打印出现"root"的匹配行

  sed -n -e '/root/p' -e '/root/=' /etc/passwd 打印匹配行和行号

  sed 's/^M//g' /etc/passwd 删除行尾控制字符(^M)= ctrl+v+m

  sed 's/^0*//g' /etc/passwd 删除行首的多个零

    sed -i '/aaa/d' abc.txt 删除文件中包含‘aaa'的行

    sed -i '/'"$var"'/d' abc.txt 同上,当字符串为变量时

  (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 '^d' 或者 ls -l | grep '^-',ls -l | grep '^l'

  (15)查看最后一列的指:ls -l | grep '^l' | awk '{print $NF}' (默认以空格分隔),在awk中,NF表示字段数,$NF表示最后一个字段

  0

  0


0 0
原创粉丝点击