Linux的一些知识(5)
文章目录
- Linux的一些知识(5)
- 1. grep命令
- 作用
- 格式及其主要参数
- 示例
- 2. find命令
- **find命令格式:**
- 参数说明
- 示例
- 1、按名字查找
- 2、按目录查找
- 3、按权限查找
- 4、按类型查找(b/d/c/p/l/f)
- 5、按属主及属组
- 6、按时间查找
- 7、按文件新旧
- 8、按大小查找
- 9、执行命令
- 关于有没有-print的区别
- 3. 管道命令
- 命令执行顺序控制
- 管道命令
1. grep命令
作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或 fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
格式及其主要参数
格式:
grep [options]
grep的常用选项:
- -V:打印grep的版本号
- -E:解释PATTERN作为扩展正则表达式,也就相当于使用egrep。
- -F:解释 PATTERN作为固定字符串的列表,由换行符分隔,其中任何一个都要匹配。也就相当于使用fgrep。
- -G:将范本样式视为普通的表示法来使用。这是默认值。加不加都是使用grep。
匹配控制选项: grep --help 可查看
- -c:只输出匹配行的计数。
- -e:使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符(-)开头的团。指定字符串做为查找文件内容的样式。
- -f:指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -i:不区分大小写。
- -h:查询多文件时不显示文件名。
- -l:查询多文件时只输出包含匹配字符的文件名,即列出文件内容符合指定的范本样式的文件名称。
- -L:列出文件内容不符合指定的范本样式的文件名称。
- -m num:当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容。
- -n:显示匹配行及行号。
- -o:只输出匹配的具体字符串,匹配行中其他内容不会输出。
- -q:安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0。
- -s:不会输出查找过程中出现的任何错误消息,-q和-s选项因为与其他系统的grep有兼容问题,shell脚本应该避免使用-q和-s,并且应该将标准和错误输出重定向到/dev/null代替。
- -v:显示不包含 匹配文本的所有行,即选择没有被匹配到的内容。
- -w:匹配整词,精确地u,单词的两百年必须是非字符符号(即不能是字母数字或下划线)。
- -x:仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)。
- -y:此参数的效果和指定“-i"参数相同。
- –color=auto:可以将找到的关键词部分加上颜色的显示。
pattern正则表达式主要参数:
- \:忽略正则表达式中特殊字符的原有含义。
- ^:匹配正则表达式的开始行。
- $:匹配正则表达式的结束行。
-
\<
:从匹配正则表达式的行开始。 -
\>
:到陪陪正则表达式的行结束。 -
[]
:单个字符,如[A]即A符合要求。 - [-] :范围,如[A-Z],即A、B、C一直到Z都符合要求。
- . :所有的单个字符。
- *:所有的字符,长度可以为0
示例
简单例子如下:
eg1:grep ‘test’ d*
显示所有以d开头的文件中包含test的行。
eg2:grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
eg3:grep ‘[a-z]{5}’ aa
显示aa文件中所有包含每个字符串至少有5个连续小写字符的字符串的行。
复杂例子如下:
明确要求搜索子目录:
grep -r
或忽略子目录:
grep -d skip
如果有很多输出时,您可以通过管道将其转到’less’上阅读:
grep magic /tmp/Documentation/* | less
有一点需要注意,使用的话必须提供一个文件过滤方式(搜索全部文件的话用*)。如果忘了,'grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 , 然后再试。
一些命令行参数:
grep -i pattern files:不区分大小写的搜索。默认情况区分大小写。
grep -l pattern files:只列出匹配的文件名。
grep -L pattern files:列出不匹配的文件名。
grep -w pattern files :之匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’)。
grep -C number pattern files:匹配的上下文分别显示[number]行。
grep pattern1 | pattern2 files:显示匹配 pattern1 或 pattern2 的行。
grep pattern1 files | grep pattern2:显示即匹配pattern1 又匹配pattern2 的行。
grep -n pattern files :显示行号信息。
grep -c pattern files:显示查找总行数。
还有用于搜索的特殊符号:
\<
和\>
分别标注单词的开始与结尾。eg:
grep man * 会匹配 ‘Batman’、‘manic’、'man’等。
grep '\<man' *
匹配’manic’和’man’,但不是’Batman’。
grep '\<man\>'
只匹配’man’,而不是’Batman’或’manic’等其他的字符串。‘^’ :指匹配的字符串在行首。
‘$’ :指匹配的字符串在行尾。
2. find命令
Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
find命令格式:
find path -option [-print] [ -exec -ok |xargs |grep] [ command {} \;]
find命令的参数:
(1)**path:**要查找的目录路径。
- ~表示$HOME目录
- .表示当前目录
- /表示根目录
(2)**print:**表示将结果输出到标准输出。
(3)**exec:**对匹配的文件执行该参数所给出的shell命令。
形式为command {} ; 注意{}与;之间有空格。
(4)**ok:**与exec作用相同,区别在于,在执行命令之前,都会给出提示,让用户确认是否执行。
(5)**|xargs:**与exec作用相同,起承接作用,区别在于 |xargs主要用于承接删除操作,而 -exec 都可用,如复制、移动、重命名等。
(6)**options:**表示查找方式。
options常用的有以下选项:
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按族来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存在
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-mount #查文件时不快乐文件系统mount点
-follow #如果遇到符号链接文件,就跟踪连接所指的文件
-prune #忽略某个目录
参数说明
- amin n :在过去n分钟内被读取过
- -anewer file:比文件file更晚被读取过的文件
- -atime n:在过去n天被读取过的文件
- -cmin n:在过去n分钟内被修改过
- -cnewer file:比文件file更新的文件
- -ctime n:在过去n天内被修改过的文件
注:以上+n表示n以前,-n 表示n以内
- -empty:空的文件 -gid n or -groupname:gid是n或是group名称是name
- -ipath p,-path p:路径名称符合p的文件,ipath会忽略大小写
- -name name,-iname name:文件名称符合name的文件。iname会忽略大小写。
- -size n:文件大小是n,单位:b代表512位元组的区块,c表示字元数,k表示kilo bytes。
- -type c:文件类型是c的文件。
d:目录
c:字型装置文件
b:区块装置文件
p:具名贮列
f:一般文件
l :符号连接
s:socket
- -pid n :processs id是n的文件
可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 or exp2
exp1,exp2
示例
1、按名字查找
eg:find . -name ‘[A-Z]*.txt’ -print
在当前目录及子目录中,查找大写字母开头的txt文件
eg:find /etc -name ‘host*’ -print
在/etc及其子目录中,查找host开头的文件
eg:find ~ -name ‘*’ -print
在$HOME目录及其子目录中,查找host开头的文件
eg:
find . -name "out*" -prune -o -name "*.txt" -print
在当前目录及子目录中,查找不是out开头的txt文件。
2、按目录查找
eg:find . -path “./aa” -prune -o -name “*.txt” -print
在当前目录除aa之外的子目录内搜索txt文件
eg:find . -path ‘./aa’ -o -path ‘./bb’ -a prune -o name ‘*.txt’ -print
在当前目录及除aa和bb之外的子目录中查找txt文件
eg:find . ! -name “.” -type d -prune -o -type f -name “*.txt” -print
或:find . -name *.txt -type f -print
3、按权限查找
eg:find . -perm 755 -print
在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件
eg:find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
查找用户有写权限或者组用户有写权限的文件或目录
4、按类型查找(b/d/c/p/l/f)
eg:find . -type | -print
在当前目录及子目录下,查找符号链接文件
5、按属主及属组
eg:find / -user www -type f -print
查找属主是www的文件
eg:find / -nouser -type f -print
查找属主被删除的文件
eg:find / -group mysql -type f -print
查找属组 mysql 的文件
eg:find / -nogroup -type f -print
查找用户组被删掉的文件
6、按时间查找
eg:find . -mtime -2 -type f -print
查找2天内被更改过的文件
eg:find . -mtime +2 -type f -print
查找2天前被更改过的文件
eg:find . -atime -1 -type f -print
查找一天内被访问的文件
eg:find . -atime +1 -type f -print
查找一天前被访问的文件
eg:find . -ctime -1 -type f -print
查找一天内状态被改变的文件
eg:find . -ctime +1 -type f -print
查找一天前状态被改变的文件
eg:find . -cmin +10 -type f -print
查找10分钟以前状态被改变的文件
7、按文件新旧
eg:find . -newer “aa.txt” -type f -print
查找比 aa.txt 新的文件
eg:find . ! -newer “aa.txt” -type f -print
查找比 aa.txt 旧的文件
eg:find . -newer ‘aa.txt’ ! -newer ‘bb.txt’ -type f -print
查找比aa.txt新,比bb.txt旧的文件
8、按大小查找
eg:find / -size +1M -type f -print
查找超过1M的文件
eg:find . -size 6c -print
查找等于6字节的文件
eg:find . -size -32k -print
查找小于32k的文件
9、执行命令
eg:find . -name ‘del.txt’ -ok rm {} ;
查找 del.txt 并删除,删除前提示确认
eg:find . -name ‘aa.txt’ -exec cp {} {}.bak ;
查找 aa.txt 并备份为aa.txt.bak
eg:find . -type f -exec ls -l {} ;
查找当前目录下的所有普通文件,并在 -exec 选项中使用 ls -l 命令将它们列出
eg:find logs -type f -mtime +5 -exec -ok rm {} ;
在 /logs 目录中查找更改时间在5日以前的文件并删除它们
eg:find ./ -mtime -1 -type f -exec ls -l {} ;
查询当天修改过的文件
eg:find ./ -mtime -1 -type f -ok ls -l {} ;
查询文件并询问是否要显示
关于有没有-print的区别
加 -print
查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
find /home -type d -print -exec ls {} \;
3. 管道命令
学习管道命令之前先了解一下Linux的命令执行顺序
命令执行顺序控制
通常情况下,我们在终端中只能执行一条命令,然后按下回车执行,那么如何执行多条命令的?
- 顺序执行多条命令:command1;command2;command3;
简单的顺序指令可以通过 ; 来实现- 有条件的执行多条命令:command1 && command2 || command3
&&:如果前一条命令执行成功则执行下一条命令,如果command1执行成功则执行第二条命令。
||:与&&相反,是前一条命令执行不成功时执行后边的命令- $?:储存上一条命令的返回结果
管道命令
管道命令是一种通信机制,通常用于进程间的通讯(也可以通过socket 进行通信),它表现出来的形式是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
管道命令 | 作为界定符号,管道命令与上面说的连续执行命令不一样。
- 管道命令仅能处理 standard output,对于stand error output会予以忽略。
less,more,head,tail… 都可以接受standard input命令,所以他们是管道命令。
ls,cp,mv并不会接受standard input的命令,所以他们就不是管道命令了。
- 管道命令必须要能够接受来自前一个命令的数据称为standard input 继续处理才行
管道命令的处理图如下:
管道命令操作符是:"|",它 只能处理经由前面一个指令传出的正确输出信息,对错误信息没有直接处理能力。然后,传递给下一条命令,作为标准的输入。
如管道命令的处理图所示:[command1]正确输出,作为[command2]的输入,然后[command2]的输出作为[command3]的输入,[command3]输出就会直接显示在屏幕上面了。
通过管道之后[command1]和[command2]的正确输出不显示在屏幕上面。
注意:
- 管道命令只处理前一个命令正确输出,不处理错误输出;
- 管道命令右边命令,必须能够接收标准输入流命令才行;
eg:
ls -al /etc | less
通过管道将ls -al的输出作为下一命令less的输入,方便浏览;