- getopts
- grep && egrep
- $读取命令行参数
- chmod
- sort
- uniq
- wc
- cut
getopts
1 |
|
getopts的使用形式是:getopts option_string variable
getopts一共有两个参数,test.sh -a hello
第一个是-a
这样的选项,第二个参数是 hello
这样的参数。
option_string之间可以直接相连,把:
加在某个选项后面表示这个选项必须带有参数
例如:getopts ahfvc: option
表明选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。
grep
grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来。
grep [options]pattern [file]
option表示选项,pattern表示匹配的模式。file表示一系列文件名。
常用选项:
-c 只打印匹配的文本行的函数,不显示文本内容。
-i 匹配时忽略字母大小写
-h 当搜索多个文件,不显示匹配文件名前缀。
-l 只列出含义匹配的文本行的文件的文件名,不显示其具体匹配的内容。
-n 列出所有匹配的文本行,并显示行号
-s 不显示关于不存在或无法读取文件的错误信息
-v 只显示不匹配的文本行。
-w 匹配整个单词
-x 匹配整个文本行
-r 递归搜索,不仅搜索当前目录,还有各级子目录
-q 用于if逻辑判断
-q 参数,本意是 Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. 中文意思为,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
正则表达式
1)行首定位符 “^”
用来匹配行首的字符。表示行首的字符是^后面的那个字符。
行首定位符位于所作用的字符之前
例如:
1 | #列出/etc目录中的以字母po开头的文件名 |
2)行尾定位符”$”
作用:定位文本行的末尾。
行尾定位符位于所作用的字符之后。
1 | #列出/etc目录中以conf结尾的文件名 |
精确匹配一个文本行:^cat$
完全匹配cat的文本行
^$
:匹配所有空行
单独的^和$没有任何意义,因为任何一个文本行都有开头和结尾。
3)单个字符匹配”.”
圆点.
用来匹配任意单个字符。包括空格,但不包括换行符\n。当使用.
后,意味着该位置一定有一个字符,无论他是什么字符。
(可以连续使用..来匹配多个字符,如l..p,匹配含义字母l,然后是两个任意字符,再接着是字母p的字符串)
4) 限定符“*”
限定符本身不代表任何字符,用来指定其前面的一个字符必须重复出现多次才能满足匹配。而星号表示匹配其前导字符的任意次数,包括0次。
5) 字符集匹配“[]”
只要某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,就满足匹配规则。
对于连续的数字或字母,可使用连字符-来表示一个范围。
如:[a-f]表示匹配a到f中的任意一个字母
[0-9]匹配任意单个数字
6)字符集不匹配“[^]”
egrep
(egrep命令默认使用扩展正则表达式)
1 )限定符“+”
“+”限定前面的字符至少出现一次。
#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行
1 | #筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行 |
结果:sssd
2)限定符“?”
限定前面的字符最多只出现一次。
1 | #筛选以字符串“ss”开头,后面跟着0或者1个s的文本行 |
结果:ssh,ssl,sssd
3)竖线“|”和圆括号“()”
竖线|表示多个正则表达式之前或的关系
圆括号表示一组可选值得集合。
竖线和圆括号经常一起使用,表示一组可选值。
1 | #筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行 |
$读取命令行参数
1 | #all params 全部参数 |
chmod
chmod [可选项]
1 | 可选项: |
数字权限使用格式
在这种使用方式中,首先我们需要了解数字如何表示权限。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,如: rwx = 4 + 2 + 1 = 7 rw = 4 + 2 = 6 rx = 4 +1 = 5 即
若要同时设置 rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7 若要同时设置 rw- (可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6 若要同时设置 r-x (可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5
上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。语法格式为 :chmod <abc> file...
1 | 其中 |
范例:
- 设置所有人可以读写及执行
1 | chmod 777 file (等价于 chmod u=rwx,g=rwx,o=rwx file 或 chmod a=rwx file) |
- 设置拥有者可读写,其他人不可读写执行
1 | chmod 600 file (等价于 chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file ) |
常见的权限表示形式有:
1 | -rw------- (600) 只有拥有者有读写权限。 |
关于第一位最高位的解释: 上面我们说到了权限表示中后九位的含义,剩下的第一位代表的是文件的类型,类型可以是下面几个中的一个:
1 | d代表的是目录(directroy) |
sort
1) sort的工作原理
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
2) sort的-u选项
输出行中去除重复行。
3) sort的-r选项
sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
4) sort的-o选项
由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。
但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。
1 | [rocrocket@rocrocket programming]$ sort -r number.txt > number.txt |
看,竟然将number清空了。
就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。
1 | [rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt |
5) sort的-n选项
你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。
我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!
6) sort的-t选项和-k选项
如果有一个文件的内容是这样:
1 | [rocrocket@rocrocket programming]$ cat facebook.txt |
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。
那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?
幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)
指定了间隔符之后,就可以用-k来指定列数了。
1 | [rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt |
我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。
uniq
1 | 用法:uniq [选项]... [文件] |
wc
1 | wc [-clw][--help][--version][文件...] |
- -c或–bytes或–chars 只显示Bytes数。
- -l或–lines 只显示行数。
- -w或–words 只显示字数。
- –help 在线帮助。
- –version 显示版本信息。
cut
1 | cut -c -b -f -d -s |
-c character
-b byte
-f field
-d delimiter分隔符
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段
参考资料
《sort帮你排序》-linux命令五分钟系列之二十六 作者 roc)