开发者社区> 技术小阿哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

shell语言

简介:
+关注继续查看

1.一些基本的shell命令

(1)shell引用操作符:

‘’:单引号,禁止任何元字符转义,在‘’中的都作为普通字符  a=1;echo '${a}'->${a}

“”:双引号,只允许变量替代和命令替代${},$()  a=1;echo "${a}"-> 1

\   :元字符转义

(2)shell变量扩展

${#variable}  替换变量中字母的个数。如果*或者@,长度就是位置参量的个数   

${va:-WORD}:当变量未定义或值为空时,输出值为WORD的,否则返回变量的值。
${va:=WORD}:当变量未定义或值为空时,输出WORD并将WORD字符串赋给va变量,否则返回变量值。
${va:+WORD}:当变量非空时,输出WORD,否则输出空。
${va:?MESSAGE}:当变量非空时,正常输出va的值。否则将消息MESSAGE送到标准错误输出(若此替换出现在SHELL程序中,那么该程序将终止运行)。

符号含义:#左删除 %右删除 /替换 :取子串

(2.1)删除子串
var=http://www.linuxidc.com///test.htm

1). # 最小左删除子串:从左向右最小匹配截取,删除左边字符,保留右边字符。
例子:echo ${var#*//}
说明:其中 var 是变量名,# 号是运算符,*// 匹配最小的左边字符串
结果:www.linuxidc.com/test.htm
 
2). ## 最大左删除子串:从左向右截取,删除左边字符,保留右边字符。
例子:echo ${var##*/}
说明:##*/ 在var中匹配最大字符串,删除左边字符,保留右边字符。      
结果:test.htm

3). %  最小右删除子串:从右向左匹最小匹配截取,删除右边字符,保留左边字符
例子:echo ${var%/*}
说明:在var中从右向左匹配最小字符串,删除右边字符,保留右边字符。
结果:http://www.linuxidc.com//

4). %% 最大右删除子串:从右向左匹最大匹配截取,删除右边字符,保留左边字符
例子:echo ${var%%/*}
说明:%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

(2.2)取子串

var=http://www.linuxidc.com///test.htm

5). 左数取子串:从左边第几个字符开始,截取字符的个数
例子:echo ${var:0:5}
说明:其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果:http:

6). 左数至尾取子串:从左边第几个字符开始,一直到结束。
例子:echo ${var:7}
说明:其中的 7 表示左边第8个字符开始,一直到结束。
结果:www.linuxidc.com/test.htm

7). 右数取子串:从右边第几个字符开始,截取字符的个数
例子:echo ${var:0-8:4}
说明:其中的 0-8 表示右边算起第8个字符开始,4 表示截取的字符的个数。
结果是:test

8). 右数至尾取子串:从右边第几个字符开始,一直到结束。
例子:echo ${var:0-8}
说明:表示从右边第8个字符开始,一直到结束。
结果是:test.htm
(2.3)替换子串

var=http://www.http.com///test.http
9). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
例子:echo ${var/http/ftp}  
说明:从左边起,替换第一个匹配的子串http为ftp
结果:ftp://www.http.com///test.http
10).全局替换子串:将匹配的字符全部替换为指定的子串
例子:echo ${var//http/ftp}
说明:将匹配的http字符全部替换为指定的ftp
结果:ftp://www.ftp.com///test.ftp
11). 左数替换第一个子串:从左边起,只替换第一个匹配的子串。
例子:echo ${var/#http/ftp}  等价于 echo ${var/http/ftp}
说明:从左边起,替换第一个匹配的子串http为ftp
结果:ftp://www.http.com///test.http
12).右数替换第一个子串:从右边起,只替换第一个匹配的子串。
例子:echo ${var/%http/ftp}
说明:将匹配的http字符全部替换为指定的ftp
结果:http://www.http.com///test.ftp

 

(3)shell数学扩展

$[ expression ] 

$(( expression )) 

echo $[ (5 + 3) * 2] 

16 

echo $(( 5 + 4 )) 

9

[]相当于test

(())相当于let

(4)shell重定向

<  重新定向输入 

>  重新定向输出 

>>  追加输出 

2>  重新定向错误 

&>  重新定向错误和输出 

>&  重新定向错误和输出 

2>&1  重新定向错误到标准输出 

1>&2  重新定向标准输出到错误 

>|  重新定向输出的时候覆盖noclobber 

<>filename  如果是一个设备文件,就把这个文件作为标准输入和标准输出 

(5)文件压缩与备份

gzip [-cdt#] 文件名

-c 将压缩的数据输出到频幕上,可以通过数据流重导向来处理

-d 解压缩

-t 检验一个压缩的文件的一致性,看文件压缩后是否有错误

-1 -9 -6 压缩等级,速度与压缩比例的权衡

#gzip man.config  压缩该文件成 man.config.gz

#zcat man.config.gz    查看压缩文件.gz中的内容

#gzip -d man.config.gz 解压缩该文件


bzip2,bzip2 -d ,bzcat   bzip2的压缩、解压缩和查看命令,扩展名为.bz2


tar 命令结合了gzip或bzip2的压缩功能

tat [-cxtzjvfpPN] 文件或目录 ...

-c 建立压缩文件的参数命令

-x 解压缩文件的参数命令

-t 查看tarfile里面的文件       (-cxt互斥)

-v 过程可视化,显示在频幕

-z 具有gzip属性,使用gzip压缩或解压缩

-j 具有bzip2属性,使用bzip2压缩或解压缩

-f 操作的文件名,带参数选项。

-p 使用源文件的原来属性(属性不会更具用户而变)

-P 可以使用绝对路径来压缩

-N 比后面接的日期还要新的文件才会被打包


tar -cvf /tmp/am.tar  /am   将/am打包放到/tmp/am.tar里面,不压缩

tar -zcvf /tmp/am.tar.gz  /am   将/am打包放到/tmp/am.tar.gz里面,在以gzip压缩

tar -ztvf /tmp/am.tar.gz  查看压缩文件中的内容

tar -zxvf /tmp/am.tar.gz  解压


dd if=文件名或设备  of=文件名 bs=一个块的大小 count=块的个数       dd备份的目的是为了能恢复数据

dd if=/etc/passwd of=/tmp/ps.bak   将一个文件备份,类似于cp

dd if=/dev/hda of=/tmp/mbr.bak  bs=512 count=1   读硬盘数据到文件,备份硬盘1个512字节大小块的数据

dd if=/dev/hda1 of=/tmp/filename.bak             备份整个分区


cpio是通过数据流重导向的方法,将文件输入/输出的一种方式。(通过重定向输入文件名来进行备份)

cpio -covB  >[file|device]   备份

cpio -icduv <[file|device]   还原


find /  -print | cpio -covB >/dev/st0  将数据备份到磁带机

cpio -icdvt < /dev/st0   检查磁带机上存在的文件名

cpio -icdvt < /dev/st0 >/tmp/contdir   将磁带机上的文件全部读入到/tmp/dontdir目录下

(6)一些基本命令及操作

(2)Set -x;set +x 打开/关闭命令调试的跟踪功能。stty -echo ;stty echo 关闭/打开自动打印输入字符

(3)$展开运算符。${}变量展开;$()命令展开;$(())和$[]数学运算展开。

(4)文件的类型有:d目录;l链接表;s套接字;b块设备;c字符设备;p管道

(5)touch file 创建一个文件,cat file 创建文件

(6)文件权限管理

chmod 777 file ;修改文件属主、组、其他访问权限

chown username file 改变文件属主

chgrp newgrp file 改变文件组

umask 000设置文件创建屏蔽字

(7)ln -s src_path  des_path  创建文件链接

(8)Cat file &  ;在后台运行该命令

delete(line["lk"]) 删除数组中的某个元素

(9)Read var1 var2 ... Varn 从终端读n个变量,以空格分隔

     read -a vp 把数据读到数组vp

(10)Tee file;将管道数据保存在file中,并输出到终端

(11)变量操作

Uset var 清除变量 uset a

Set 显示所有变量,包括环境变量

Readonly 查看所有只读变量

Export var 导出var为环境变量,如果需要在两个不同的脚步中使用相同变量,需要将该变量导出为环境变量

(相当于C库函数的putenv())

Env 显示所有环境变量

一些环境变量:HOME,PATH,CDPATH,MAIL,EXINIT, LOGNAME,SHELL等

位置变量:

$?取命令的退出码,0为执行成功;

$#命令后的参数个数;

$n命令后的第n个参数

$*命令后的所有参数

$@命令后的所有参数

$$当前进程号

$0当前进程名

$!后台运行的最后一个进程

${a} 返回变量a的字符串

${#a}求变量a的字符串长度

(12).关于各种括号

():在子shell中执行一组命令,变量空间不同

$()和${}:$是展开运算符。$()命令展开,相当于` `;${}变量展开

[]:相当于test;(()):相当于let,let “i=i+1”  <=> ((i=i+1))  ; ((2>1))  逻辑为true时,返回$?为0

$(())和$[]:相当于expr  和let

let a=a+1

(12)test测试和let测试

一组命令[]: [ $x –gt $y ] ;[ "$name" = "" ] 

复合命令[[]]: [[ $name == [Tt]om ]] 《=》name==Tom||name==tom  ;  [[ $name == [Tt]om && $friend == "Jose" ]] 

let命令和(()):专门测试数学表达式。 (( x > 2 ))   ; (( x == 2 && y == 3 ))

(12)exit n 命令退出,0正常退出

(13)|| 和 &&

||前面命令执行失败后才执行后面命令,否则后面命令不执行。

&&前面命令执行成功后才执行后面命令,否则后面命令不执行。

(14)>file  清空文件内容

(15)Basename filepath  取文件基本名

(16)Exec 的两个作用:

1).执行命令    exec 命令

2).为文件指定描述符

exec 4>file1

exec 3<file1

read line <&3

echo “......” >&4

exec 3<&-

exec 4<&-   去除该描述符上的文件绑定

(17)Shift 左移命令行输入参数

(18)Tar ,cpio用于打包归档;gzip,gunzip用于压缩 

(19)Wget/curl  URL下载网页或远程文件

(20)数组

a=(m k n l g)

echo ${a[*]} 输出数组全部值

echo ${!a[*]}输出数组全部索引

read -a vp 把数据读到数组vp

(21)Getopts  命令行参数解析函数,可以用while 或case实现,但getopts更加简洁

(22)创建屏幕输出

(23)正则表达式的元字符集

 基本元字符集:^,$,.,*,[],[^],\<,\>

扩展元字符集:?,+,{,},|,(,) 


(24). tput 设置终端状态

tput init  初始化终端

tput blink 闪烁模式

Tput civis 隐藏光标

tput bold 粗体

Tput cup x y  移动光标位置到x,y

Tput sc 保存当前光标位置

Tput rc 恢复光标到最后保存位置

echo输出转义控制终端

echo ‘^[[?25h’ 打开光标

echo ‘^[[?25’  关闭光标

echo ‘^[[40;34m’  背景黑色前景蓝色(40-47,30-37)

(25)date 显示当前日期

date [-opt]  +%formate

date +’%d-%m-%y’   ->09-06-99

date +%T ->10:29:21

date +%A ‘  ‘ %T  -> Wednesday 10:29:21

(26)Kill -l 列出所有的shell信号 及信号号

(27)Eval 将一个字符串当做命令执行

eval ‘cat test.txt’

eval  ‘a=b’ 产生a变量

(28)bc file 按行计算文件中的数学表达式,计算功能强大

echo ‘2+3.14’ | bc

(29)Su username 切换用户 sudo username 命令  ;在username模式下执行命令

(30)Pstree 输出当前的进程树

(31)怎样的命令适合在子shell中运行:

会影响当前shell环境的命令,希望执行完该命令,shell的环境不变,如:

(cd $dir; pwd) //这样命令执行完后,不会改变当前目录。 并且能将内容输出。

()命令表示在子shell中运行

(32)cut 用于提取子串

echo 'YYYYMMDD'| cut -c 1-4   //提取出YYYY

(33)cal month year   输出某年某月的日历排布

(34) ( ls; pwd; data ) > outputfile  每个命令的输出都被送到名为outputfile的文件中,括号中的空格是必须的。 

(35)作业控制:

jobs 查看当前所有进程的编号或状态

fg 进程编号   将该进程提到前台并运行

bg 进程编号   将该进程放到后台并运行

ctl+Z  暂停当前前台进程,并放入后台

stop   暂停一个后台作业

kill 进程编号  将该进程杀死

wait 进程编号  等待该进程执行完

(36)shell元字符与文件名通配-元字符

*  匹配零或多个字符 

?  匹配一个字符 

[abc]  匹配一个字符集中的一个字符;如a、b或c 

[!abc]  匹配一个字符集外的一个字符;如非 a、b或c 

{a,ile,ax}  匹配一个字符或一个字符集 

[!a-z]  匹配从a~z范围以外的字符 

\  转义或禁止元字符 


2.文件名通配

shell中支持模糊的文件名,通配符包括三种:*,?,[]

*:通配文件名中的任何字符串,包括空

?:通配文件名中的任何一个字符

[]:通配[]中的任何一个字符

[!...]:通配非[]中的字符


ls *.doc     ;输出所有.doc文件

ls f??*s;输出以f开头s结尾中间至少有2个字符的文件名。

ls [io]*;列出以i或o开头的文件

ls  *[!0-9]* ;列出不包括数字的文件


3.Tr命令:处理行中指定的单个字符。(非正则匹配)

tr 字符处理

有4个选项:

-t 缺省选项。替换 echo " liujin" | tr -t [a-z] [A-Z] 

-s 压缩。echo "aabbcc" | tr -s [a-z]

-d 删除。echo "aabbcc" | tr -d [ab]

-c 对模式取反。echo "abc" | tr -cd [ab] 删除除ab以外的字符

例子:

Tr -s ‘[a-z]’ <ops.txt  ;压缩任何重复出现的小写字符

tr -s [\n] <ops 压缩\n;指删除空行。[]为tr的语法。

Tr -s ‘[\r] ‘  ‘[\n]’ <ops;用\n替换\r

Tr  “[A-Z] “ “[a-z]” <ops ;所有的大写替换成小写,缺省-t:替代

tr ” [b]”  “[a]” ;所有的b替换成a

tr -cs “[a-z][A-Z]”  “[\n]” ;首先\n替换非字母字符,然后压缩

tr “[0*4]”  “[*] “<ops;用等量的*替代至少连续的4个0

tr -d “[0-9][:]” ;删除0-9和:

tr -cd  [.] ;删除非‘.’字符


4.Find命令

语法: find path -opt [-print -exec -ok]

-print 打印找到的文件

-exec和-ok:对找到的文件执行该参数后的shell命令

-name:按文件名查找文件

-perm:按照文件权限查找

-prune:不查找指定子目录

-depth:查找所有子目录

-user,-group:按文件属主或组查找


find  ~  -name ‘*.txt’ -print ;在用户$HOME目录下查找

find  .  -name ‘*.txt’ -print ;在当前目录下查找名为.txt的文件

find  .  -perm  755  -print ;按文件权限查找

find  . -name ‘*.txt’ -print ;在当前目录下查找名为.txt的文件

find /etc -type d -print 在/etc下查找所有的目录文件夹

find /etc !-type d -print 在/etc下查找所有的非目录文件夹

find /etc  -size  +100c -print 长度大于100字节的文件

find etc home -depth -print | cpio -ivcdC65536 -o  /dev/rmt0    备份etc和home下的文件到/dec/rmt0中

find . -type f -exec ls -l {} \;;找到文件后执行ls-l列出文件详细信息。


5.Grep命令:输出存在匹配的行,该命令只能用来查询匹配行

语法:grep [opt] rep [file]

grep选项:

-c:只输出匹配行的计数

-i:匹配时不区分大小写

-h:查询多文件时,不显示文件名

-l:查询多文件时,只输出包含匹配字符的文件名

-n 显示匹配行和行号

-s:不显示失配信息

-v:只显示不匹配的所有行

-e:允许使用扩展正则元字符

基本元字符集:^,$,.,*,[],[^],\<,\>

扩展元字符集:?,+,{,},|,(,) 

grep -e 可使用扩展元字符集,不加'\'

egrep   可使用扩展元字符集,不加'\'

grep    使用扩展元字符集,必须加'\'

去元可以加'\'


grep “sort” *.doc;在所有doc文件中查找sort字符行

grep -c “sort” *.doc;输出包含sort的总行数

grep -n “sort” *.doc;匹配输出时添加行号

grep -v  “sort” *.doc;输出失配行

grep 's\(h\|u\)' file ;匹配sh或su

grep -e 's(h|u)' file ;匹配sh或su

egrep  's(h|u)' file ;匹配sh或su

grep –E 'sh|u' datafile ;匹配sh或者e

grep -F 0576 -R /root/zy/hahah   用grep搜索文档中的字符串

grep -v -f file1 file2      输出文件2中的内容,但是剔除包含在文件1中的内容

grep -F -f  file1 file2    可以把文件2中包含文件1记录的行输出

6.Sed命令:处理行中指定的字符串。(正则匹配)

sed的工作方式:读入一行文本到内存(模式空间),处理模式空间的文本,送往屏幕或删除;处理下一行

sed使用正则扩展元字符集时需要加'\'


语法:sed  [opt]  范围+编辑命令  输入文件


sed的选项不多,只有五个:

-n:静默选项,即不输出当前行(默认是输出的),除非使用p命令

-e:多重命令或者说添加脚本到命令执行

-f:执行sed脚本文件

--help:sed帮助

-V:查看sed版本


sed是通过依次执行命令来编辑处理文本的,sed的编辑命令有:

,范围运算符 1,4表示1-4行;1,/TOM/ 第一行至/TOM/模式所在的行

a\  在当前行后面加入一行或者文本 

i\  在当前行上面插入文本 

c\  用新的文本改变或者替代本行的文本 


!  表示后面的命令对所有没有被选定的行发生作用 ,反向选定(用在选定命令后面/TOM/!匹配不包含TOM的行)

s/re/string/  用string替换正则表达式re 

=  打印当前行号码 

{..}匹配后后,要执行一个命令集合,需要使用{}


d  从模板块(Pattern space)位置删除行 

g  行内全面匹配,而不是只匹配行内第一个模式 

n  读取下一个输入行,用下一个命令处理新的行而不是用第一个命令 

p  打印模板块的行 

q  退出sed 

r file  从file中读行 


h  拷贝模板块的内容到内存中的保持缓冲区 

H  追加模板块的内容到内存中的保持缓冲区 

G  获得内存缓冲区的内容,并追加到当前模板块文本的后面 

x  互换模式空间和保持缓冲区的内容(此时原模式空间的内容还没有输出)


D  删除模板块的第一行 

l  列表不能打印字符的清单 


N  追加下一个输入行到模板块后面并在二者之间嵌入一个新的行, 改变当前行的号码 

P  打印模板块的第一行 

y  把一个字符翻译为另外的字符(但是不能用于正则表达式)

t label  if分支,从最后一行开始,条件一旦被满足或者T命令或者t命令,将导致分支到带有标号的命令处,或者到脚本的末尾 

T label  错误分支,从最后一行开始,一旦发生错误或者T 命令或者t命令,将导致分支到带有标号的命令处,或者到脚本的末尾 

b label  分支到脚本中带有标号的地方,如果标号不存在就分支到脚本的末尾 

w file  写并追模板块到file末尾 

W file  写并追模板块的第一行到file末尾 



例子:(sed -e 范围+命令 -e 范围+命令 -e 范围+命令 ...)

sed -e ‘1,3d’ -e ‘s/abc/def/g’ quote ;多重命令-e, 

sed -n '1,3/tom/{s/tom/sam/g;s/jim/fk/g}   ;需要对匹配的行执行多个命令时,使用{}


sed 5,$s/night/NIGHT &/ quote; 只在5-$行执行s命令

sed -n ‘2p’ quote.txt  ;输出第二行

sed -n ‘1,$p’  quote.txt ;输出1到最后一行

sed -n ‘5/ing/p’  quote.txt ;如果第5行匹配ing,则输出第5行

sed -f  /comp/a\ “suddenly it happen” quote ;附加在comp行后

sed -f  /comp/c\ “suddenly it happen” quote ;替换comp行

sed  s/night/NIGHT/ quote ;替换指定字符串

sed s/night/NIGHT &/ quote;在该行匹配字符串前加入字符串 (&保存发现的night,并用night替代&,然后执行s命令)

echo “AC456” |sed ‘s/[0-9][0-9]*/&  passed/g’ -->AC456 passed 在匹配字符后插入

sed -n /tom/!d file  ;删除不匹配tom的行--反向匹配

echo "liujin   lp" | sed "s/ *//g" //匹配行内子字符串,而不是匹配空白行。

echo "       " | sed "s/ *//"   //匹配空白的行

sed '/Suan/r newfile.txt' datafile ;匹配后,将newfile.txt的内容全部读入追加在匹配行之后

sed –n '/north/w newfile.txt' datafile  ;匹配后,将该行写入文件newfile.txt中

sed '1,3/^north /a\--->THE NORTH SALES DISTRICT HAS MOVED<---' datafile 匹配后追加文本

sed '/eastern /{ n; s/AM/Archie/; }' datafile  ;n命令:当匹配模式后,将下一行读入模式空间,执行n命名后面的命令

sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' datafile  ,y命令把所有的小写字符转变为大写字符。正则表达式元字符不能使用这个命令。

sed '5q' datafile 处理完前5行后退出

sed '/Lewis/{ s/Lewis/Joseph/;q; }' datafile

sed -e '/northeast/h'  -e  '$G'  datafile  匹配后,h命令将该行复制到保持缓冲区;匹配$后,执行G命令:先将模式缓存区的内容输出,然后将保持缓冲区的内容复


制到模式缓冲区,处理完后输出。

sed –e '/patricia/h' -e '/Margot/x' datafile  互换模板块中的文本和缓冲区中的文本 ,相当于用 /patricia/替代了/Margot/行

sed –f sedscript datafile  执行sed脚本

 sedscript:相当于使用多个-e选项,针对模式空间依次执行下面的命令

    /western/, /southeast/{ 

/^ *$/d 

        /Suan/{ h; d; } 

      } 

   /Ann/g 

   s/TB \(Savage\)/Thomas \1/ 



7.Awk命令:

awk使用的是扩展正则表达式,但有些扩展用不了,比如‘{}’,但是gawk对于扩展正则表达式的支持比awk要好很多

可以熟练的进行数据表操作,抽取信息,支持正则匹配。Awk中的命令语法基本与C相同,可以使用if while等。Awk能完成大部分命令能完成的工作。

(天生支持正则扩展元字符集,使用扩展元字符集是不用加'\')


语法:

1.awk [-F sep]  '条件或模式{动作}'  infile   ;对满足条件或模式的行执行动作

2.awk [-F sep]  '条件或模式'  infile;对满足条件或模式的行直接打印输出

3.awk [-F sep]  '{动作}'  infile   ;对所有行都执行动作


选项:

-help 可以查看awk的全部选项

-f 执行AWK脚本

-F fs 指定输入文件的分隔符FS的值,fs是一个字符串或者一个正则表达式 

~ ,!~ :awk的匹配和不匹配运算符



awk内置变量

ARGC命令行参数个数;ARGV命令行参数数组

ARGC  命令行参数的数量 

ARGIND  命令行正在处理的当前文件的AGV的索引(仅在gawk中有效) 

ARGV  命令行参数数组 

CONVFMT  转换数字格式(仅在 gawk 中有效) ,默认%.6g 

ENVIRON  从shell传递来的包含当前环境变量的数组 

ERRNO  当使用close函数或者通过getline函数读取的时候,发生的重新定向错误的描述信息就保存在这个变量中(仅在 gawk 中有效) 

FIELDWIDTHS  在对记录进行固定域宽的分割时, 可以替代FS的分隔符的列表 (仅在gawk中有效) 

FILENAME  当前的输入文件名 

FNR  当前文件的记录号(awk输入多文件时,指当前文件的记录号) 

FS  输入域分隔符,默认是空格 

IGNORECASE  在正则表达式和字符串操作中关闭大小写敏感(仅在gawk 中有效) 

NF  当前文件域的数量 

NR  当前记录号 (awk输入多文件时,所有文件统一的当前记录号) 

OFMT  数字输出格式 

OFS  输出域分隔符 

ORS  输出记录分隔符 

RLENGTH  通过match函数匹配的字符串的长度 

RS  输入记录分隔符 

RSTART  通过match函数匹配的字符串的偏移量 

RT  记录结束符在输入文本的时候,gawk把它设为与RS相同 

SUBSEP  下标分隔符


awk内建函数:

Split(string, array, field seperator)  Split(string, array) 

gsub(r,s)用s替代r;  awk `gsub(/4842/,4899){print $0}` grate.txt替换/4842/模式为4899

index(s,t)t在s中的位置。

Length(s)字符串长度;

match(s,r)测试s是否包含r的字符串,返回匹配位置,0失配;

substr(s,m)返回s中从m开始的后面部分;substr("Santa Claus", 7, 6 )

match(string, reg) match函数返回在字符串中正则表达式位置的索引,如果找不到指定的模式则返回0;start=match("Good USA", /[A-Z]+$/)->返回6

systime() 函数:。systime 函数返回从 1970 年 1 月 1 日(称为元年)开始到当前时间秒数(时间戳)

atan2(x)cos(x) exp(x) int(x) log(x) rand() sin(x) 



流控制:只能作为‘动作’用在{}中

If(){}else if(){}else{}

For(;;){}  for(a in b){}

While(){}

Next命令,退出下面程序的执行,awk开始下一行输入

Exit n 退出awk

 


Awk /mary/ filename :打印匹配的行

Awk {print $1}  :打印每行的第一字段

Awk ‘/marry/{print $1}’ 打印匹配行的第一个字段

Awk  -F ‘[:\t]’ ‘{print $1}’  使用:和空白作为分隔符

 

例子1:

awk ‘BEGIN{} {} END{}’ ;BEGIN和END引导的{}中的命令只执行一次,中间{}执行循环,

awk ‘{print $0}’ grate.txt  ;打印出所有的域

awk ‘{if($0~/al/) print $0}’ grate.txt 打印匹配al的行

awk ‘$3=='48' {print  $0}’ grate.txt打印$3==48的行

awk ‘/48/’ grate.txt 打印匹配48的行

Awk ‘/a/,/b/’ file ;打印出a所在的行到->b所在的行(范围运算)

awk ‘{if($5<AGE)print $0}’ AGE=10 grate.txt 向awk命令中传值




awk的重定向与管道(允许在awk中执行shell命令,通过管道或重定向到shell中的部分需要使用"")

awk ‘$4 >= 70 {print $1, $2 > "passing_file" }’ filename;   awk中允许使用重定向

awk ‘BEGIN{ "date" | getline d; print d}’ filename; awk中允许执行shell命令和使用管道 

awk ‘{print $1, $2 | "sort –r +1 –2 +0 –1 "}’ names

close("sort –r +1 –2 +0 –1") 关闭这条到shell命令中的管道,awk中,同时只能有一条打开的管道,用了要关闭才能再用

system ( "cat  " $1 ) 

 

例子2:

awk 脚本:test.awk

BEGIN{OFS='\t'} 


/TOM/{ list[NR] = $1 }   #对/TOM/行执行

$1=='23' {print $3}#对$1=='23'时执行

{print $0}#对所有行执行

END{ for (n = 1; n <= NR; n++)

         Print list[n]

   } 

awk -f test.awk datafile

 

例子3:序列for:统计mou.txt文件中各个单词的个数

gawk -F" "  {  i=1;while(i<=NF)  {a[$i]++; i++;} }

END{ for (b in a) {print b "  " a[b];}}   // b in a 是将数组a的关键字赋给b

 


将c文件中第一列放到到d文件中的第三列

    $ cat c

    a

    b

    c

    $ cat d

    1 one

    2 two

    3 three

$ awk '{getline f<"c";print $0,f}' d

8.合并与分割

(1)sort命令:将许多不同的列按不同的列顺序分类。

语法:sort -cmu -o out_file [other_opt] +pos1 +pos2 input_file

-c:测试文件是否已经分类

-m:合并两个分类文件

-u:删除相邻重复行

-b:使用域进行分类时,忽略第一个空格

-n:指定按域上的数字大写分类,而不是字母比较

-t:指定域分隔符

-r:降序排序

+n:n为域号,使用此域号分类


sort -c video.txt ->sort:disordor on video.txt 测试是否已经排序

sort -t:video.txt ;以:为分隔符,按$0排序

sort -t:+2 -r  video.txt ;按$2逆序排序

sort -t:+3n  video.txt ;按$3的数字大小排序

sort -t:-k3  video.txt ;按$3的为关键字排序排序

sort -t:+3.2  video.txt ;从$3的第2个字符开始排序

(2)head 与tail

head和tail命令:输出文件前/后指定行数

head/tail  -n file

head -5 file ;输出前5行

head -n 5 file ;输出前5行


(3)uniq命令:

语法: uniq -u d c -f infile outfile

-u :只显示不重复行

-d:只显示有重复数据行,重复行只显示一次

-c:打印重复行出现次数和不重复的文本行

-n:n为数字,前n个域被忽略


uniq -c myfile.txt

3 may day

1 going down

1 may day

uniq -d myfile.txt ->may day


(4)join命令:将两个分类文本按域相同结合在一起


join -j1 3 -j2 2 -o 1.2,2.3 file1 file2 按文件1的第3域与文件2的第2域连接,输出文件1的第2域和文件2的第3域


join -a1 -a2  file1 file2输出文件1和文件2的不匹配行


(5)cut命令:输出指定的列范围或域范围

语法:[opt] file1 file2

cut -d: -f1,3 file1 以:为分隔,剪切域1和域3

cut -c4-6 file1 ;剪切第4-6个字符,

echo ‘liujin’ | cut -c1-3 ;可以剪切任意字符串


(6)paste命令:将连个文件粘贴在一起

paste file1 file2;左右拼接文件

paste -s file1 file2;是上述方式的转置

 cat file1 file2 >file3可以上下拼接文件

(7)split命令:将文件按指定行数分割成多个文件

split -2 file; 将file按每个文件2行分割成多个文件


9.Test 测试命令-用以测试文件,字符串和数字

测试文件:-d 目录;-f 文件;-l 符号链接;-r 可读

  -s 非空;-w可写;-u存在suid设置,-x可执行

测试字符串: =;!=;-z 空串;-n 非空串

[-z $a]   test $a=$b

测试数值:-eq相等;-ne不等;-gt大于;-lt小于;

 -le小于等于;-ge大于等于

[$a -eq ‘50’]

  -t 特殊测试命令:测试当前脚本运行在交互或非交互模式

TRUE 交互模式,FALSE 非交互模式(后台,守护)


10.shell流控制结构(: 执行空命令,返回总是为true)

(1) if

if  测试条件1 then

命令1

Elif 测试条件2

命令2

Else 

命令3

Fi

    If 语句可以用来做任何命令的执行结果检查

[ -t ] 测试当前脚本是否运行在交互模式或是后台模式,为TRUE 交互模式。

 

(2)case

Case 变量值 in

模式1) ......

;;

模式2) ......

;;

模式3|模式4) ......

;;

*) ......          #default

;;

     Esac

在case中*表示任意字符串,?表示任意单个字符,[...]表示取一个字符

Case 常用来解析命令选项

(3)for  用于处理序列

For 变量名 in 字符串列表-空格分隔-不能有括号

Do

...

Done

 

For loop in  `ls`

Do

...

Done

For loop #当缺少in时,从命令行接收参数,相当于in $@

Do

...

Done

 

(4)While

While 命令(TRUE)

  Do

...

Done

(5)until

until命令(false)

  Do

...

Done

 

(6) break,continue 可以用于for ,while,until中。

Break n;可以指定跳出第几重循环

 

 

11.shell函数

(1)函数名()

{

 函数体

Return 0/1    ->0无错误

}

(2)向函数中传递参数

与命令行传递参数一样,在函数中可以使用$n访问

(3)函数输出使用echo等输出到终端

(4)函数文件的调用

          1.在函数文件中最后指明解释器#!/bin/sh

          2.在脚本中包含函数 ./func_filename

          3.调用函数

取消包含:uset func_filename

使用set 可以观察到当前shell中能使用的所有函数




1.tar

Tar -cvf des_file src_file_list 压缩

Tar -xvf file 解压缩

2.Apropos cmd_name 显示该命令的作用

3.Whatis cmd_name 显示该命令的作用

4.Finger [user_name]显示当前系统的登录用户,比who更详细

5.Write user_name textcontent 向某个已登录终端用户发送消息

6.Mesg n/y 拒绝或允许接受消息

7.Rm 删除文件 rmdir删除文件夹 mv移动文件

8.Cmp比较两个文件cmp f1 f2

9.Cpio对文件进行归档或者从归档文件中恢复文件

10.Diff 显示两个文件的不同之处

11.Man 显示命令对应的help文档

12.Od 转储文件内容

13.Du file_list 显示文件占有磁盘信息


网络工具

1.ftp 通过网络传输文件

2.Rcp/Scp 从远程系统复制文件 或将文件复制到远程系统

3.Rlogin 登录远程系统

4.Rsh 在远程系统执行命令

5.Telnet 通过网络与远程系统建立连接

6.Kill 根据pid杀死进程

7.Killall根据名称杀死进程

8.Stty显示或者设置终端参数




本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1652037,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C++ 中嵌入shell语言
在C++中是可以嵌入shell语言的,在开发时候用到了system语句,在使用system函数时,参数是char类型,如果输入字符串拼接类型则编译不通过,比如“system("mv " + file_name +" func_bak.
585 0
监控多台服务器磁盘利用率shell脚本
监控多台服务器磁盘利用率shell脚本
63 0
Shell脚本数组与字符串处理|学习笔记
快速学习Shell脚本数组与字符串处理
62 0
13688
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载