本文列明Linux的经常使用命令用法,学会了这些命令以后,结合shell编程知识,就能够作各类自动编译/集成的工做啦。
本文地址:http://www.javashuo.com/article/p-bkarbrbm-dm.htmlhtml
《Linux Shell 脚本攻略》
Linux中怎么找出空文件夹?git
cat file1 file2 file3 ...
除了常有的用来显示文件内容以外,cat
有两个妙用:正则表达式
xxxx | cat - output.txt
本例中使用“-
”表示stdin,用xxxx命令的输出重定向给cat
shell
cat file1 | file2 > output.txt
将两个文本合并编程
cat -s input.txt
cat -n input.txt
基本用法:file -name 'xxx'
。其中能够指定文件夹,好比find /dev/ -name ...
。在BSD中,目标文件夹是必须指定的。在Linux中,则能够不指定,默认是当前文件夹。
若是要求忽略大小写,则使用选项-iname
。name参数后面的字符串可使用正则表达式。segmentfault
可使用-o
选项来表示“OR”,而且用“\(
”和“\)
”做为条件总体括起来。如:socket
find \(-name 'aaa.txt' -o -name 'aaa.doc' \)
须要注意的是,\(
以后和\)
以前必须有空格svn
-name
用于匹配文件名,可是可使用-path
用来匹配路径:函数
find ./ -path "*/doc/*"
若是要匹配正则表达式路径,则使用-regex
或-iregex
(忽略大小写)。此时已path而不是name方式搜寻。code
能够指定“不”匹配条件,使用感叹号便可,如:
find ./ ! -name "*.txt"
-maxdepth
和-mindepth
,好比搜寻当前文件夹,则使用-maxdepth 1
-perm mode
/+mode
/-mode
。其中mode是一个八进制数,对应chmod
命令里面的mode。加号表示“任意一个位”,减号表示“全部1位匹配”,无符号表示“完整匹配”
find能够匹配文件类型:-type x
,其中x能够是如下值:
f
:file,文件l
:link,符号连接d
:directory,目录/文件夹c
:char,字符设备b
:block,块设备s
:socketp
:pipe参数都是如下格式:-选项 天数
,天数表示距离今天几天内。选项以下:
-atime
:access time-mtime
:modification time-ctime
:change time(注:这个和mtime有啥区别?)好比搜索7天内访问过的全部文件:find . -type f -atime -7
或者是访问超过7天的文件:find . -type f -atime +7
也能够是刚好7天:find . -type f -atime 7
上述参数是以天为单位的。下面几个参数以分钟为单位:-amin
, -mmin
, -cmim
-size 参数
后面的参数能够用多种单位,好比c
(char,字节)、k
、M
、G
。好比查找大于2kB的文件:find . -type f -size +2k
在find命令后面加上-delete
参数,find会将匹配到的文件都删除掉。这个功能颇有用,可是要当心用。
使用-exec
对find的每个目标进行操做,使用“{}
”匹配每个文件名。好比将全部带“configure”的文件加上执行权限:find . -name "configure" -type f -exec chmod +x {}
说实话我以为还不如使用xargs
来得方便。
使用-print0
,将\0
做为文件名之间的分割符。参见xargs
的使用。
find . -type d -empty
这是我在吧项目从svn迁移到git所遇到的问题——git不支持空文件夹啊……因此我得找到全部的空文件夹再作特殊处理。
有些命令能够支持stdin重定向做为输入,这是极好的。可是大部分不行。这个时候就须要使用xargs
了。。
这个命令的做用就是将stdout的内容,做为其余命令的参数进行调用。基本格式是:
command | xargs ...
最简单的应用是将stdout一个一个输出给命令,以换行符为单位,好比:find -name ".svn" | xargs rm -rf
这样的结果是find输出的每一行都被执行了rm -rf ...操做。
第二种应用是指定参数个数,好比:find -name "*.txt" | xargs -n 2 cat
使用-n
参数,xargs能够每次传递指定数量的参数给command,若是参数不足,则传递剩余所有参数。
使用-I
参数指定一个字符串做为宏,而且在后面这个宏出现的位置中,替换成参数。在一些xargs实现中,-I
参数是必需的。好比:find -name ".svn" | xargs -I {} rm {} -rf
find命令的分隔符除了多是'\n
以外,也多是' '
(空格)。为了防止错误,find应该使用-print0
选项,而xargs使用-0
(杠零) 选项。好比:find -name ".svn" -print0 | xargs -0 rm -rf
tr [options] set1 set2
这是一个简易的命令。tr将stdin的字符从set1的规则映射为set2规则,而后从新输出到stdout。好比将所有字母小写:...... | tr 'A-Z' 'a-z'
set1和set2分别是两个集合,好比'a-z'
, 'a-z0-9'
, '12345'
等等都是合法集合。集合中也可使用转义字符,好比\t
, \n
。
使用tr删除字符,用-d
选项:...... | tr -d '0-9'
使用tr压缩连续字符(典型应用:删除连续空格):-s
选项,如:...... | tr -s ' '
grep能够单独使用,直接为其指定搜索的文件:grep "all:" Makefile
上面是在Makefile中搜索带字符“all:”的行。grep会打印出全部符合条件的行。
grep也能够指定多个文件,如:grep "all:" Makefile Makefile.in
grep能够指定搜索的目录。此时grep会递归艘运目录下的全部文件,如:grep "main(" ./ -r
能够在当前目录下查找main
函数。
若是grep的非选项参数只有一个,那么grep会自动从stdin中得到输入。
使用-o
选项使得grep不是输出一整行,而只是指定的文本。
虽然加上-e
选项可让grep支持正则表达式,但实际上建议直接使用egrep
使用选项-n
,常常搭配-r
来搜索文字。使用-Ax
打印匹配目标以后的x行;使用-Bx
打印匹配目标以前的 x行;使用-Cx
打印先后x行。
使用-e
来匹配多个样式,如:...... | grep -e "Linux" -e "BSD"
-i
选项
使用-q
选项。这个模式下,grep不输出内容,只在结束的时候给出返回值。匹配成功时,返回0;失败时,返回非零值。
使用-v
作反匹配。我常用的一个组合命令就是:
查找我相对于svn上,修改了的文件列表:svn stat | egrep -v "^\?"
使用-l
选项,只打印匹配的文件名。
直接上例子吧:cut -f 2,3 table.txt
,这个命令表示将文件中全部第二和第三列的内容打印出来。(列数从1开始而不是0)。
更多的状况下,咱们是将它接在管道下的,有了cut命令,咱们就能够很方便地去裁剪。若是没有文件参数,cut会自动从stdin中获取文本,正如grep同样。
若是没有指定界定符的话,cut使用默认的。通常咱们要使用-d
来指定,好比指定斜杠:cut -f 2,3 -d "/" table.txt
一般cut的模式是“选中”,若是加上--complement
选项则变成“清除”
-f
选项有几种写法,以下:
-f 2
:指定第二列-f 2,3,5
:指定第2、3、五列-f 2-
:指定第二及之后的列-f 2-5
:指定第二至五列-5
:指定第一至五列对于没有界定符的行,cut会将哪一行原本来本的输出。若是想要忽略这样的行,则使用-s
选项
sed是stream editor的缩写。好比最简单的指定文本替换:sed 's/aaa/bbb' input.txt
,将文件input.txt中全部的“aaa”替换成“bbb”。表达式能够用单引号或者双引号定义。
sed在不指定文件名的状况下,接受stdin做为输入源。
默认状况下,sed只是将替换的文本输出,使用-i
保存文件,或者是使用重定向来另存为新的文件。
默认状况下,sed只会替换每一行的第一处匹配。绝大多数状况下咱们须要加上g
字符来要求匹配全行全部文本。好比上述命令应该修改成:sed 's/aaa/bbb/g' input.txt
。而若是是Ng
则表示从第N个匹配开始替换。
sed使用几种定界符/
, |
, :
,因此使用这些符号做为文本字符时,都须要转义。
使用格式sed '/......d' file
来删除匹配的格式。删除空白行的时候能够这么写:sed '/^\s*$/d' file
匹配内容若是是正则表达式,咱们事先是不知道具体的字符串是什么的。可是若是要使用匹配到的内容来操做的话,咱们需却又须要这个字符串。这个时候有两种方法:
方法一:使用&
来引用匹配到的文本(所以&
也是关键字)
方法二:使用正则表达式的“捕获分组”概念,匹配到的祖父穿的分组能够在替换字符串中引用,即“\1
”、“\2
”等方式。
注意,在sed中的用于分组的括号不能写做“()
”,而是“\(\)
”
sed的替换操做能够级联起来,最直接的方法是使用管道:sed '...' | sed '...'
第二种方法是在模式中用分号分隔(因此分号也是关键字):sed '...;...'
第三种是使用-e
选项:sed -e '...' -e '...'
sed 's/^M//' filename > newfile
其中的“^M
”不是普通字符,须要用Ctrl + V + M
打出来。
若是咱们使用脚本,怎么读取一个命令输出的信息呢?以下:
for FILE in `find -iname '*.txt' -type f` do ...... # 使用FILE变量操做 while