Linux下shell编程(三)
来源:互联网 发布:厦门大数据产业协会 编辑:程序博客网 时间:2024/05/08 19:00
通配符
* 匹配 0 或多个字符
? 匹配任意单一字符
[list] 匹配 list 中的任意单一字符
[!list] 匹配不在 list 中的任意单一字符
{string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串
例:
a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如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
- Linux下shell编程(三)
- Linux下的shell编程入门(三)
- linux shell编程(三)
- linux shell 编程(三)
- Linux程序设计(Linux shell编程三)
- Linux复习(三)Shell编程1
- Linux下Shell编程
- linux下shell编程
- Linux下Shell编程
- Linux下shell编程
- Linux 下shell编程
- Linux下Shell编程
- Linux 下shell编程
- Linux下shell编程
- linux下shell编程
- unix 下shell编程(三)
- linux shell 学习笔记(三)--shell编程基础
- Linux的shell编程(三)
- Ubuntu15.04编译安装nodejsV0.12.3
- 网络爬虫原理
- ArcGIS教程:Spatial Analyst 扩展模块浏览
- 程序员是吃青春饭的吗
- Fragment管理策略
- Linux下shell编程(三)
- STVD+COSMIC编译工程时can't open file crtsi0.sm8
- 艾灸疗法作用
- 图解数据结构(4)——二分法查找法
- MongoDB基本命令用
- 黑马程序员 JAVA基础学习笔记 图形化等
- iOS: NSTimer使用
- 图解数据结构(5)——散列法及哈希表
- STVD+COSMIC编译工程时出现Error creating process for executable mapinfo