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 继续处理才行

管道命令的处理图如下:

linux 搭建gre隧道_find命令

管道命令操作符是:"|",它 只能处理经由前面一个指令传出的正确输出信息,对错误信息没有直接处理能力。然后,传递给下一条命令,作为标准的输入。

如管道命令的处理图所示:[command1]正确输出,作为[command2]的输入,然后[command2]的输出作为[command3]的输入,[command3]输出就会直接显示在屏幕上面了。

通过管道之后[command1]和[command2]的正确输出不显示在屏幕上面。

注意:

  • 管道命令只处理前一个命令正确输出,不处理错误输出;
  • 管道命令右边命令,必须能够接收标准输入流命令才行;

eg:

ls -al /etc | less
通过管道将ls -al的输出作为下一命令less的输入,方便浏览;