博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell常用集锦
阅读量:6226 次
发布时间:2019-06-21

本文共 7503 字,大约阅读时间需要 25 分钟。

hot3.png

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

另外,对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;实例如下:

#!/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

$ basename thisfile.txt .txt

thisfile

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

$ echo "thisfile.txt"|awk -F . '{print $NF}'

txt

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

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

 

转载于:https://my.oschina.net/u/144160/blog/756967

你可能感兴趣的文章
006 复杂的数据类型&函数(方法)
查看>>
javascript:getElementsByName td name
查看>>
ASP.NET连接SQL、Access、Excel数据库(二)——连接实例
查看>>
FreeRTOS 特性简介
查看>>
Linux--前后端分离部署
查看>>
java阶段学习目标
查看>>
Azure IoT 技术研究系列2
查看>>
day24-3-2子类继承构造方法
查看>>
我们一起学习WCF 第五篇数据协定和消息协定
查看>>
Linux 与 Windows 文件互传(VMWare)
查看>>
Python学习笔记八 面向对象高级编程(一)
查看>>
Oracle内置函数
查看>>
UVA 1645 Count
查看>>
贪吃蛇程序
查看>>
poj 1419 Graph Coloring
查看>>
node的安装及其运用及相关配置
查看>>
第19篇 2016年计划
查看>>
左连接,右连接,内连接
查看>>
Django+element ui前后端不分离的博客程序
查看>>
托福听力
查看>>