sheel命令学习和⼯作总结。
⼯作两年后,发现sheel脚本⽤的挺多,⼀直感觉⾃⼰⽤的还可以,后来才发现很多地⽅⾃⼰不够清楚,特写下这篇博客对⽤到的地⽅进⾏总结。
⼀、sheel加载的四种⽅式。
1、⼯作⽬录执⾏。
⼯作⽬录执⾏,指的是执⾏脚本时,先进⼊到脚本所在的⽬录(此时,称为⼯作⽬录),然后使⽤ ./脚本⽅式执⾏
[tan@tan scripts]$ ./test.sh
-bash: ./test.sh: Permission denied
[tan@tan scripts]$ chmod764 test.sh
[tan@tan scripts]$ ./test.sh
Hello Shell
如图,报了权限错误,上⼀篇博⽂有提到,这⾥需要赋权,使⽤chmod 764 test.sh赋权后就可以正常执⾏了
./的意思是说在当前的⼯作⽬录下执⾏hello.sh。如果不加上./,bash可能会响应到不到hello.sh的错误信息。
因为⽬前的⼯作⽬录(/data/shell)可能不在执⾏程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。
查看PATH的内容可⽤echo $PASH 命令。现在的/data/shell就不在环境变量PASH中的,所以必须加上./才可执⾏。
2、绝对⽬录执⾏。
绝对⽬录和⼯作⽬录执⾏没有本质的差别,都需要有可执⾏权限。
3、sh执⾏。
指的是⽤脚步对应的sh或bash来解析脚步执⾏。
[tan@tan scripts]$ sh test.sh
Hello Shell正则匹配到第一个关键字就停止
[tan@tan scripts]$ bash test.sh
Hello Shell
注意,若是以⽅法三的⽅式来执⾏,那么,可以不必事先设定shell的执⾏权限,甚⾄都不⽤写shell⽂件中的第⼀⾏(指定bash路径)。
因为⽅法三是将hello.sh作为参数传给sh(bash)命令来执⾏的。这时不是hello.sh⾃⼰来执⾏,⽽是被⼈家调⽤执⾏,所以不要执
⾏权限。那么不⽤指定bash路径⾃然也好理解了啊,呵呵……。
4、source和.执⾏。
指的是在当前的shell环境中执⾏,也需要有执⾏权限,但是相⽐前⾯三个不会创建⼀个⼦进程来执⾏。
[tan@tan scripts]$ . test.sh
Hello Shell
[tan@tan scripts]$ source test.sh
Hello Shell
⼆、dirname和basename的使⽤
cur_dir=$(cd $(dirname $0);pwd) #获取当前路径
BASE_PARENT_DIR=$(dirname $cur_dir)#获取⽬录的上⼀级⽬录
basename /usr/bin/sort
Output "sort".
basename include/stdio.h .h
Output "stdio".
三、echo
echo <;和echo <<;的作⽤
echo > 是输出重定向
echo >> 输出追加重定向
> /dev/null 2>&1 1和2都输出到⿊洞
echo 的显⽰
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-E disable interpretation of backslash escapes (default)
四、sed
sed表⽰Stream Editor,流式编辑器⼜名⾏编辑器,每次编辑⼀⾏,它可以执⾏各种功能,如搜索、查、修改、插⼊或删除⽂件,此外,他也可以执⾏复制的正则表达式匹配。它可以⽤于以下⽬的:
查和替换匹配给定的格式的内容
在指定⾏查和替换匹配给定格式的内容
在所有⾏查和替换匹配给定格式的内容
搜索并同时替换两种不同的模式
使⽤的格式如下:sed [操作选项] ‘命令’ ⽂件名,
常⽤的操作选项如下:
-n:指定处理后只显⽰该⾏
-e:进⾏多项编辑任务
-i:直接修改读取的⽂件内容,⽽不是由屏幕输出。
-f 该选项会将其后⽂件中的脚步命令添加到已有的命令中。
常⽤的命令选项如下:
p:打印匹配⾏
a:新增
c:替代⼀⾏
d:删除定位⾏
s:替代⼀⾏中的某些部分
g:全局替换标志
n:1-512之间的数字,表⽰出现第⼏次替换。
正则表达式:
1、符号".":
匹配任意⼀个字符,除了换⾏符,但是需要注意的是,在sed中不能匹配换⾏符,但是在awk中可以匹配换⾏符。类似shell通配符中的"?",匹配⼀个任意字符。
2、符号"*":
"*"表⽰前边字符有0个或多个。".*"表⽰任意⼀个字符有0个或多个,也就是能匹配任意的字符。类似shell通配符中的"*",可以匹配任意字符。
3、符号"[]":
"[ ]"中括号中可以包含表⽰字符集的表达式。使⽤⽅法⼤概有如下⼏种。
[a-z]:表⽰a-z字符中的⼀个,也就是⼩写字母。
[0-9]:表⽰0-9字符中的⼀个,也就是表⽰数字。
[A-Z]:表⽰⼤写字母。
[a-zA-Z]:表⽰字符集为⼩写字母或者⼤写字母。
[a-zA-Z0-9]:表⽰普通字符,包括⼤⼩写字母和数字。
[abc]:表⽰字符a或者字符b或者字符c。
[^0-9]:表⽰⾮数字类型的字符,^表⽰取反意思,只能放在中括号的开始处才有意义。
[-cz]:表⽰字符-或者字符c或者字符z,注意与[c-z]的区别,因为-符号没有放在e和f之间。
4. 符号"^":
^"表⽰⾏⾸的意思,也就是每⼀⾏的开始位置。在这⾥并不是上边字符范围中取反的意思,^符号只有在"[]"符号的开头处才能表⽰字符取反。
^abc:表⽰以abc开头的字符串abc。
^abc.*:表⽰以abc开头的字符串abcxxx。
5. 符号"$"
"$"表⽰⾏尾的意思,也就是每⼀⾏的结尾位置,很好理解,和"^"正好相反。
world$:表⽰以world结尾的字符串world,如果该⾏中间有world字符串是不符合匹配条件的。
^$:表⽰空⾏。⾏⾸和⾏尾没有内容,可不就是空⾏嘛。
6. 符号"\":
"\"表⽰是转义字符,和其它语⾔中⽤到的转义字符意义基本上是⼀样的。其实简单理解,就是把元字符转义为普通字符,⽐如"\\"表⽰普通符号"\",把普通字符转换为特殊意义符号,⽐如"\n"表⽰把普通字符n转义为换⾏符。
7. 符号"{}":
"{}"表⽰前边字符的数量范围,⼤概有三种⽤法,其实容易理解,看例⼦就知道了,但是必须注意要加上转义字符"\",否则不⽣效,表⽰为普通字符"{"或"}"。
\{2\}:表⽰前边字符的重复次数是2。
\{2,\}:表⽰前边字符的重复次数⾄少是2,也就是⼤于等于2。
\{2,9\}:表⽰前边字符的重复次数⼤于2但⼩于9。
8. 符号"\<"和"\>":
"\<"表⽰匹配条件为词⾸的位置,理解上可以对⽐"^"⾏⾸。
举个例⼦,"nihao 1hello 2hello3 hello4"有这么内容的⼀⾏内容。
"\<hello"匹配结果"nihao 1hello 2hello3 hello4";
"hello\>"匹配结果"nihao 1hello 2hello3 hello4",这种匹配⽅式⽤的不是太多,⽤到会⽤就OK
使⽤例⼦:
1、显⽰
sed -n '2p' 只显⽰第⼆⾏
sed -n '1,3p' 打印第⼀⾏到第三⾏
sed -n '/mov/p' 打印含mov的⾏
sed -n "/kevin/,/frank/" 打印匹配kevin开始,frank为结束的⾏
2、删除
sed'2d' 删除第⼆⾏
sed'3,$d' 删除第三⾏到最后⼀⾏,$表⽰最后⼀⾏
3、查询
sed -n '/hello/p' 查询包含关键字hello的所有⾏
4、代替
sed'1c Hi' 第⼀⾏替代为Hi
sed '/tom/c Hi' 仅仅替换有tom的⾏
sed -n '/hello/p' | sed's/hello/bid/g'把hello替换bird
sed 's/to/tt/2' 只替换第2个to
sed 's/^/\/\/ comment /' 开头加点注释
sed 's/$/\/\/ comment /' 末尾加点注释
sed -i /^servial/c"hello" 以serial开头的⾏替换为hello
5、插⼊
sed -i '$a bye' 在最后⼀⾏插⼊bye
sed -i 可以看到命令不⼀定⾮要⽤‘’
五、awk
awk是⼀个强⼤的⽂本分析⼯具,它把⽂件逐⾏的读⼊,以空格为默认分割符将每⾏分割为多个字段。
使⽤⽅式:awk [OPTIONS] ‘pattern {action}’ filenames,其中pattern是要查的内容(可以没有,也叫匹配的规则),action到匹配内容时所执⾏的命令
last -n 5 | awk'{print $1}'列出最近五个登录⽤户
cat /etc/passwd | awk -F ':''{print $1}'
awk -F ':''$1=="root" {print $0}' /etc/paswd -F指定分隔符,$0表⽰整⾏,$1表⽰第⼀列,条件后有空格
awk -F 'a|b' '{}'或者awk -F '[a|b]' '{}'以a或者b作为分割符,和awk -F "[ab]" '{}'作⽤⼀样
awk -F "[a][b]" '{}'这种形式的分隔符是合并的关系,即以ab作为⼀个字符分割
awk中两个特别的表达式,BEGIN和END,都可以⽤于pattern中,在程序赋予初始状态和程序结束之后的⼀些扫尾⼯作
awk -F, ‘BEGIN{sum=0}{sum==$3}END{print sum/1024/1024" GB"}'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论