a=$( expr 'helloworld20140501.txt' : '.*\([0-9]\{8\}\).*' )echo $alinux shell 中可以将命令的结果赋值给变量,$(命令)这种格式将返回命令执行后的结果字符串上面命令执行后,变量a的值是20140501 a=`echo 'helloworld20140501.txt'|sed 's/.*\([0-9]\{8\}\).*/\1/'`这个命令作用也是一样,变量a被赋值为20140501
===========================================================================
中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。
我所知道的,bash中,目前有五种方法: 1. i=`expr $i + 1`; 2. let i+=1; 3. ((i++)); 4. i=$[$i+1]; 5. i=$(( $i + 1 )) 可以实践一下,简单的实例如下:#!/bin/bash i=0; while [ $i -lt 4 ]; do echo $i; i=`expr $i + 1`; # let i+=1; # ((i++)); # i=$[$i+1]; # i=$(( $i + 1 )) done |
#!/bin/bash for j in $(seq 1 5) do echo $j done |
================================================================================
在服务器上加了一个服务检测机制,用到正则来匹配IP和捕获分组。和其他语言一样也可以使用正则分组捕获,不过不能使用 $1或\1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}来获得,如${BASH_REMATCH[1]},${BASH_REMATCH[N]}
简单的测试如下所示:
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash ip="121.0.2.2" if [[ $ip =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]];then echo "match" echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} echo ${BASH_REMATCH[3]} echo ${BASH_REMATCH[4]} else echo "Not match" fi |
=================================================================================
The command basename
is often used to extract the real file name without the file type specific file extension:
1 2 |
|
Now sometimes you need it the other way around, you might want to have the file extension. There are of course hundreds of ways to do so, but I found this one appealing since it also shows how the command works (which I should learn a bit better I think):
1 2 |
|
The “-F” marks the delimiter, “$NF” means the last field generated. Seems to be a pretty straightforward tool.
==========================================================================
awk中使用的shell命令,有2种方法:
一。使用system() 二。使用print cmd | “/bin/bash” http://www.gnu.org/software/gawk/manual/gawk.html#I_002fO-Functions 一。使用所以system() awk程序中我们可以使用system() 函数去调用shell命令如:awk 'BEGIN{system("echo abc")}' file
echo abc 就会做为“命令行”,由shell来执行,所以我们会得到以下结果:
root:~# awk 'BEGIN{system("echo abc")}' abc root:~# root:~# awk 'BEGIN{v1="echo";v2="abc";system(v1" "v2)}' abc root:~# root:~# awk 'BEGIN{v1="echo";v2="abc";system(v1 v2)}' /bin/sh: echoabc: command not found root@ubuntu:~# root@ubuntu:~# awk 'BEGIN{v1=echo;v2=abc;system(v1" "v2)}' root@ubuntu:~# 从上面的例子,我们简单的分析一下awk是怎样调用system的: 如果system()括号里面的参数没有加上双引号的话,awk认为它是一个变量,它会从awk的变量里面把它们先置换为常量,然后再回传给shell 如果system()括号里面的参数有加上双引号的话,那么awk就直接把引号里面的内容回传给shell,作为shell的“命令行” 二。使用print cmd | “/bin/bash” root@ubuntu:~# awk 'BEGIN{print "echo","abc"| "/bin/bash"}' abc root@ubuntu:~# root@ubuntu:~# awk 'BEGIN{print "echo","abc",";","echo","123"| "/bin/bash"}' abc 123 root@ubuntu:~# 三。总结 无论使用system()还是print cmd | “/bin/bash” awk都是新开一个shell,在相应的cmdline参数送回给shell,所以要注意当前shell变量与新开shell变量问题==========================================================================
获取文件名和后缀名
代码:
file=”thisfile.txt”
echo “filename: ${file%.*}”
echo “extension: ${file##*.}”
输出:
filename: thisfile
extension: txt
附:
Bash字符串处理
基于Pattern Matching的子串替换
${STR/$OLD/$NEW}
替换第一个。
${STR//$OLD/$NEW}
替换所有。
注意:不能使用正则表达式,只能使用?*的Shell扩展。只能用shell通配符如 * ? [list] [!list] [a-z]。
${STR/#$OLD/$NEW}
替换开头。如果STR以OLD串开头,则替换。
${STR/%$OLD/$NEW}
替换结尾。如果STR以OLD串结尾,则替换。
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR/o/O}
HellO World
[user@laptop ~]# echo ${STR//o/O}
HellO WOrld
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR/#He/he}
hello World
[user@laptop ~]# echo ${STR/#o/he}
Hello World
[user@laptop ~]# echo ${STR/%He/he}
Hello World
[user@laptop ~]# echo ${STR/%ld/lD}
Hello WorlD
如果被替换串包含/字符,那么要转义,写成\/。
[user@laptop ~]# filename=”/user/admin/monitoring/process.sh”
[user@laptop ~]# echo ${filename/#\/user/\/tmp}
/tmp/admin/monitoring/process.sh
[user@laptop ~]# echo ${filename/%.*/.ksh}
/user/admin/monitoring/process.ksh
[user@laptop ~]#
将环境变量PATH的各个目录分开,每行显示一个。
echo -e ${PATH/:/\n}
[user@laptop ctmw]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/user/bin
[user@laptop ctmw]# echo -e ${PATH//:/’\n’}
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
[user@laptop ctmw]# echo “${PATH//:/$’\n’}”
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/user/bin
基于Pattern Matching的子串删除
子串删除是一种特殊的替换
${STR/$SUB}
将STR中第一个SUB子串删除
${STR//$SUB}
将STR中所有SUB子串删除
${STR#$PREFIX}
去头,从开头去除最短匹配前缀
${STR##$PREFIX}
去头,从开头去除最长匹配前缀
${STR%$SUFFIX}
去尾,从结尾去除最短匹配后缀
${STR%%$SUFFIX}
去尾,从结尾去除最长匹配后缀
注意:经常会记错#和%的含义,有一个帮助记忆的方法
看一下键盘,#在$之前,%在$之后,就知道#去头,%去尾。
注意:不能使用正则表达式,只能使用?*的Shell扩展。
[user@laptop ~]# STR=”Hello World”
[user@laptop ~]# echo ${STR#He}
llo World
[user@laptop ~]# echo ${STR#He*o}
World
[user@laptop ~]# echo ${STR##He*o}
rld
[user@laptop ~]# PREFIX=”*o”
[user@laptop ~]# echo ${STR#$PREFIX}
World
[user@laptop ~]# echo ${STR##$PREFIX}
rld
[user@laptop ~]# echo ${STR%o*}
Hello W
[user@laptop ~]# echo ${STR%%o*}
Hell
[user@laptop ~]# SUFFIX=”o*”
[user@laptop ~]# echo ${STR%$SUFFIX}
Hello W
[user@laptop ~]# echo ${STR%%$SUFFIX}
Hell
典型应用:得到文件的扩展名
[user@laptop ~]# FILE=hello.jpg
[user@laptop ~]# echo ${FILE##*.}
jpg
使用sed命令实现正则表达式替换
使用sed命令可以进行正则表达式的替换。
echo “$STR” | sed “s/$OLD/$NEW/”
将STR中的OLD子串替换成NEW。
[user@laptop ~]# STR=”123456789″
[user@laptop ~]# echo “$STR” | sed s/345/OK/
12OK6789
[user@laptop ~]# OLD=345
[user@laptop ~]# NEW=OK
[user@laptop ~]# echo “$STR” | sed “s/$OLD/$NEW/”
12OK6789
使用tr命令实现字符集合的替换
使用tr命令可以实现字符的替换,并且可以是从一批字符到另一批字符的替换。比如小写字母变成大写字母,或者反过来。
[user@laptop ~]# echo “bash” | tr “[a-z]” “[b-z]”
cbti
上面的命令是将原串中的a替换成b,被替换成c,以此类推。
网上问题:Linux中 有没有一个命令可以将 字符串中出现的 +或者- 替换成对应的-或者+ 即 “+” ——> “-” “-”——>”+” 例如 GMT+8-9变成 GMT-8+9
[user@laptop ~]# echo “GMT+8-9″ | sed ‘s/-/#/g’ | sed ‘s/+/-/g’ | sed ‘s/#/+/g’
GMT-8+9
上面是网上提供的答案。如果用tr来实现,更简洁些。
[user@laptop ~]# echo “GMT+8-9″ | tr “+-” “-+”
GMT-8+9
路径字符串的处理
dirname ${FULLPATH}
取目录部分。
basename ${FULLPATH}
取文件名部分。
basename ${FULLPATH} ${EXT}
取文件名部分,并且去掉指定的扩展名。
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz
[user@laptop ~]# dirname “$FULLPATH”
/user/work/project
[user@laptop ~]# basename “$FULLPATH”
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .gz
backup.tar
[user@laptop ~]# basename “$FULLPATH” .tar
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH” .tar.gz
backup
取目录部分:${FULLPATH%/*}
(类似 dirname “$FULLPATH”)
取文件名称:FILE=${FULLPATH##*/}
(类似 basename “$FULLPATH”)
取最短基本名称:${FILE%%.*}
取最长基本名称:${FILE%.*}
取最短扩展名:${FILE##*.} 或者 ${FULLPATH##*.}
取最长扩展名:${FILE#*.} 或者 ${FULLPATH#*.}
[user@laptop ~]# FULLPATH=/user/work/project/backup.tar.gz
[user@laptop ~]# echo ${FULLPATH%/*}
/user/work/project
[user@laptop ~]# dirname “$FULLPATH”
/user/work/project
[user@laptop ~]# FILE=${FULLPATH##*/}
[user@laptop ~]# echo $FILE
backup.tar.gz
[user@laptop ~]# basename “$FULLPATH”
backup.tar.gz
[user@laptop ~]# echo ${FILE%%.*}
backup
[user@laptop ~]# echo ${FILE%.*}
backup.tar
[user@laptop ~]# echo ${FILE##*.}
gz
[user@laptop ~]# echo ${FILE#*.}
tar.gz
=============================================================================