Linux下shell编程(三)

来源:互联网 发布:厦门大数据产业协会 编辑:程序博客网 时间:2024/05/08 19:00

通配符

*     匹配 或多个字符

?      匹配任意单一字符

[list]   匹配 list 中的任意单一字符

[!list]      匹配不在 list 中的任意单一字符

{string1,string2,...}  匹配 sring1 或 string2 (或更多)其一字符串

例:

a*b  ab之间可以有任意长度的任意字符也可以一个也没有aabcb, axyzb, a012b, ab

a?b  ab之间必须也只能有一个字符可以是任意字符aab, abb, acb, a0b

a[xyz]b   ab之间必须也只能有一个字符但只能是 或 或 z, : axb, ayb, azb

a[!0-9]b  ab之间必须也只能有一个字符但不能是阿拉伯数字axb, aab, a-b

--------------------

转义字符

 $     用于参数代换

 `      反引号,用于命令代换

/$    实现美元标志

/’     实现反引号的文本化(去除反引号的特殊意义)

/”     实现双引号的文本化(去除双引号的特殊意义)

//     实现反斜杠的文本化(去除反斜杠的特殊意义)

/(反斜杠)

--------------------

^     表示句首 ^abc 表示以 abc 开首的句子.

$     表示句尾 abc$ 表示以 abc 结尾的句子.

/<    表示词首 /<abc 表示以 abc 开首的词.

/>    表示词尾 abc/> 表示以 abc 结尾的词


管道与重定向

一般一个进程至少使用三个文件描述符:标准输入、标准输出和标准错误输出。它们相应的序号是 0、1 和 2。一般来说,这三个描述符与该进程启动的终端相关联,其中输入为键盘。重定向和管道的目的是重定向这些描述符。

假设你想要一张 images 目录中所有以 .png 结尾的文件列表。该列表非常长,因此你会想把它先放到一个文件中,然后在有空的时候查看。你可以输入下述命令:
$ ls images/*.png 1>file_list
这表示把该命令的标准输出(1)重定向到(>)file_list 文件。其中的 > 操作符是输出重定向符。如果要重定向到的文件不存在,它将被创建;不过如果它已经存在,那么它先前的内容将被覆盖。不过,该操作符默认的描述符就是标准输出,因此就不用在命令行上特意指出。

管道在某种程度上是输入和输出重定向的结合。

其原理同物理管道类似:一个进程向管道的一端发送数据,而另一个进程从该管道的另一端读取数据。

管道符是‘ |’.

我要查找当前系统里是否有一个进程名为httpd的进程在运行,使用ps -ef执行时会列出所有的进程,不方便查找,我可以使用管道让显示的结果简单化:
ps -ef  | grep httpd


常用的几个命令工具:awk 、cut 

awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的。awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个域(段),域和域之间使用分割符分割。


awk 会把每行进行一个拆分,用相应的命令对拆分出来的“段”进行处理。

(1)行工作模式,读入文件的每一行,会把一行的内容,存到$0里

(2)使用内置的变量FS(段的分隔符,默认用的是空白字符),分割这一行,把分割出来的每个段存到相应的变量$(1-100)

(3)输出的时候按照内置变量OFS(out FS),输出

(4)读入下一行继续操作

(NF :最后一个字段)

awk [-F  field-separator]  'commands'  input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

实际例子:

huzlMAC-AIR:shell huzl008$ echo "this is a book" > awk.txthuzlMAC-AIR:shell huzl008$ echo "there are books" >> awk.txthuzlMAC-AIR:shell huzl008$ cat awk.txt this is a bookthere are bookshuzlMAC-AIR:shell huzl008$ awk '{print $3,$4 }' awk.txta bookbooks huzlMAC-AIR:shell huzl008$ awk '{print $1,$2 }' awk.txtthis isthere arehuzlMAC-AIR:shell huzl008$huzlMAC-AIR:shell huzl008$ awk '{print $NF }' awk.txtbookbooks
huzlMAC-AIR:shell huzl008$ cat passwd | head -n 5 | awk -F ':' '{print "path:" $NF }' 
path:/usr/bin/falsepath:/bin/shpath:/usr/bin/falsepath:/usr/sbin/uucicopath:/usr/bin/false

awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
使用printf 可以使代码更简洁。

huzlMAC-AIR:shell huzl008$ awk '{printf("%s--%s\n",$2,$3) }' awk.txtis--aare--bookshuzlMAC-AIR:shell huzl008$ 
详细的awk用法见http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

利用管道和awk 获取IP地址(MAC)

ifconfig en0 | grep inet | awk '{print $2}'

Cut命令使用

shell中的cut命令 

cut是以每一行为一个处理对象的

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

应用举例:
huzlMAC-AIR:shell huzl008$ whohuzl008  console  May 23 18:51 huzl008  ttys000  May 26 10:40 huzlMAC-AIR:shell huzl008$ who | cut -b 3zzhuzlMAC-AIR:shell huzl008$ who | cut -b 3-5zl0zl0huzlMAC-AIR:shell huzl008$ who | cut -b 3-5,10zl0czl0thuzlMAC-AIR:shell huzl008$

huzlMAC-AIR:shell huzl008$ cat passwd | head -n 5 nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/falseroot:*:0:0:System Administrator:/var/root:/bin/shdaemon:*:1:1:System Services:/var/root:/usr/bin/false_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/falsehuzlMAC-AIR:shell huzl008$ cat passwd | head -n 5 | cut -d : -f 1nobodyrootdaemon_uucp_taskgatedhuzlMAC-AIR:shell huzl008$ cat passwd | head -n 5 | cut -d : -f 1-3nobody:*:-2root:*:0daemon:*:1_uucp:*:4_taskgated:*:13huzlMAC-AIR:shell huzl008$ 


tr命令

tr 命令的功能
tr命名是简化了的sed命令。其主要的功能包括:
a. 用一个字符来替换另外一个字符。
b. 删除字符串中的指定子串。
c. 合并字符串中重复串。


 合并字符串中重复出现的字符
 tr -s "[\n]" < input.txt    #文件input.txt中的所有重复出现的换行符最多只出现一次。
 echo aaaabbbbccccddddddd | tr -s "[a-z]" 输出abcd
 

删除字符串中得字符

echo helloworld | tr -d "o"  #输出hellwrld
注意echo helloworld | tr -d "hello"的输出结果是wrd,因此tr是将字符串1的各个字符串单独处理的

字符串的替换
假设input.txt中内容是a:b:c:d:e,那么运行tr -s "[:]" "[\t]" < input.txt的结果将是a  b  c  d,各个子串间以tab隔开



seq 用法:

$ seq 1000   #起始默认是 1,间隔默认也是1
$ seq 2 1000  #间隔默认是1
$ seq 1 3 10    #从1到10,间隔为3,结果是:1 4 7 10









0 0
原创粉丝点击