Linux进阶

Linux_2

查找文件和文件内容

find命令

find是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。

find命令选项

-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了 - depth
选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n
表示文件更改时间距现在 n天以前。Find命令还有-atim e和- ctime选项,但它们都和-mtime选项
相似,所以我们在这里只介绍 -mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在 /etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在 /etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

#例子
#使用name选项
[root@laiwenzhuo MyWorkSpace]# ls
directory  dockerfile  for.sh  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# find . -name "*.sh" -print  # . 表示当前目录及其子目录 -print 查询到的结果打印出来

[root@laiwenzhuo MyWorkSpace]# find /home/MyWorkSpace -name "*.sh" -print  #也可以给出绝对路径
/home/MyWorkSpace/test.sh
/home/MyWorkSpace/test2.sh
/home/MyWorkSpace/while.sh
/home/MyWorkSpace/for.sh
./test.sh
./test2.sh
./while.sh
./for.sh

#使用perm选项
#如果希望按照文件权限模式来查找文件的话,可以采用 -perm选项。你可能需要找到所有
#用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。在使用这一选项的时候,最好使用八进制的权限表示法。
#为了在当前目录下查找文件权限位为 755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
[root@laiwenzhuo MyWorkSpace]# find . -perm 755 -print
.
./dockerfile
./directory


#使用type选项
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。

[root@laiwenzhuo MyWorkSpace]# find . -type f -print #查询当前目录及其子目录下的文件类型的文件
./test.sh
./test2.sh
./while.sh
./for.sh

定时任务

at命令

at命令允许用户向cron守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能 是指10min以后,也可能是指几天以后。如果你希望在一个月或更长的时间以后运行,最好还 是使用crontab文件。 一旦一个作业被提交, a t命令将会保留所有当前的环境变量,包括路径,不象 crontab, 只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户,除非你对其输出 进行了重定向,绝大多数情况下是重定向到某个文件中。 和cr ontab一样,根用户可以通过/etc目录下的at.allow和at .deny文件来控制哪些用户可以 第3章 后台执行命令使用at命令,哪些用户不行。不过一般来说,对at命令的使用不如对crontab的使用限制那么严格。

at命令的基本形式为:

at [-f script] [-m -l -r] [time] [date] 其中,

-f script 是所要提交的脚本或命令。

-l 列出当前所有等待运行的作业。 atq命令具有相同的作用。

-r 清除作业。为了清除某个作业,还要提供相应的作业标识( ID);有些UNIX变体只 接受atrm作为清除命令。

-m 作业完成后给用户发邮件。

time at命令的时间格式非常灵活;可以是 H、H H .HHMM、HH : MM或H:M,其中H和M 分别是小时和分钟。还可以使用 a.m.或p.m .。

date 日期格式可以是月份数或日期数,而且 a t命令还能够识别诸如today、tomorrow这样 的词。

#使用at命令提交命令或脚本
#使用at命令提交作业有几种不同的形式,可以通过命令行方式,也可以使用 at命令提示符。
#一般来说在提交若干行的系统命令时,我使用 at命令提示符方式,而在提交 shell脚本时,使用命令行方式。
#如果你想提交若干行的命令,可以在 at命令后面跟上日期/时间并回车。然后就进入了at命
#令提示符,这时只需逐条输入相应的命令,然后按‘ <CTRL-D>’退出。下面给出一个例子:

[root@laiwenzhuo MyWorkSpace]# at 9:45
at> find /home/MyWorkSpace -name "*.sh" -print
at> <EOT>
job 6 at Wed Jul 15 09:45:00 2020

#提交脚本
[root@laiwenzhuo MyWorkSpace]# at 3:00pm -f /home/MyWorkSpace/test.sh
job 7 at Wed Jul 15 15:00:00 2020


#查看提交的作业
[root@laiwenzhuo MyWorkSpace]# at -l
7       Wed Jul 15 15:00:00 2020 a root


#清除一个作业
[root@laiwenzhuo MyWorkSpace]# at -l
7       Wed Jul 15 15:00:00 2020 a root
[root@laiwenzhuo MyWorkSpace]# atrm 7
[root@laiwenzhuo MyWorkSpace]# at -l 
[root@laiwenzhuo MyWorkSpace]# 

文件名置换

使用*

#使用*
#使用星号*可以匹配文件名中的任何字符串。在下面的例子中,我们给出文件名模式 te*,它的意思是文件名以te开头,后面可以跟随任何字符串,包括空字符串:
[root@laiwenzhuo MyWorkSpace]# ls te*
test2.sh  test.sh

#*也可以用在文件名模式的开头,在下面的例子中, * . sh匹配所有以. sh结尾的文件名:
[root@laiwenzhuo MyWorkSpace]# ls *.sh
1.sh  2.sh  3.sh  for.sh  test2.sh  test.sh  while.sh

#*还可以用在文件名的当中,在下面的例子中, te*.sh用于匹配所有以te开头、后面跟任何字符串、最后以.sh结尾的文件名:
[root@laiwenzhuo MyWorkSpace]# ls
1.sh  2.sh  3.sh  directory  dockerfile  for.sh  l  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# ls te*.sh
test2.sh  test.sh

使用?

#使用可以匹配文件名中的任何单个字符。在下面的例子中,我们列出文件名以任意两个字符开头,接着是s,后面跟任何字符的文件:

[root@laiwenzhuo MyWorkSpace]# ls ??s*
1.sh  2.sh  3.sh  test2.sh  test.sh

使用[…]和[!..]

#使用[...]可以用来匹配方括号[]中的任何字符。在这一方法中,还可以使用一个横杠-来连接两个字母或数字,以此来表示一个范围。在下面的例子中,列出了以t或w开头的文件名:

[root@laiwenzhuo MyWorkSpace]# ls
1.sh  2.sh  3.sh  directory  dockerfile  for.sh  l  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# ls [tw]*
test2.sh  test.sh  while.sh

#非t或w开头的文件或文件名
[root@laiwenzhuo MyWorkSpace]# ls [!tw]*
1.sh  2.sh  3.sh  for.sh  l

directory:

dockerfile:

shell输入与输出

echo

使用echo命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为: echo string

echo命令有很多功能,其中最常用的是下面几个:

\c 不换行。

\f 进纸。

\t 跳格。

\n 换行。

#如果是LINUX系统,那么......
#必须使用-n选项来禁止echo命令输出后换行:
#必须使用-e选项才能使转义符生效:
[root@laiwenzhuo MyWorkSpace]# echo -e "$HOME"
/root

如果想把一个字符串输出到文件中,使用重定向符号 >。在下面的例子中一个字符串被重 定向到一个名为out.txt的文件中:

[root@laiwenzhuo MyWorkSpace]# echo "这是一段文字"> out.txt
[root@laiwenzhuo MyWorkSpace]# cat out.txt 
这是一段文字


或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容:

[root@laiwenzhuo MyWorkSpace]# echo "这是一段文字aaaaaa"> out.txt
[root@laiwenzhuo MyWorkSpace]# cat out.txt                       
这是一段文字aaaaaa
[root@laiwenzhuo MyWorkSpace]# echo "这是一段文字aaaaaa">> out.txt
[root@laiwenzhuo MyWorkSpace]# cat out.txt                        
这是一段文字aaaaaa
这是一段文字aaaaaa

read

可以使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么 read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。

#在下面的例子中,只指定了一个变量,它将被赋予直至回车之前的所有内容:
[root@laiwenzhuo MyWorkSpace]# read name
我的我的
[root@laiwenzhuo MyWorkSpace]# echo $name
我的我的

#在下面的例子中,我们给出了两个变量,它们分别被赋予名字和姓氏。 shell将用空格作为变量之间的分隔符:
[root@laiwenzhuo MyWorkSpace]# read name surname
wenzhuo lai
[root@laiwenzhuo MyWorkSpace]# echo $name $surname
wenzhuo lai
#echo 和 read的使用
#编写一个脚本,代码如下
#!/bim/bash

echo -n "请输入一个字符或数字:" #-n表示换行
read s

echo $s

[root@laiwenzhuo MyWorkSpace]# sh echo.sh 
请输入一个字符或数字:56
56

cat

cat是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示 控制字符。在使用 cat命令时要注意,它不会在文件分页符处停下来;它会一下显示完整个文 件。如果希望每次显示一页,可以使用 more命令或把cat命令的输出通过管道传递到另外一个 具有分页功能的命令中

#例子
[root@laiwenzhuo MyWorkSpace]# ls
1.sh  2.sh  3.sh  directory  dockerfile  echo.sh  for.sh  l  out.txt  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# cat 1.sh 
#! /bin/bash

read -p "请输入一个字符或数字:" a
echo $a
[root@laiwenzhuo MyWorkSpace]# cat 1.sh 2.sh 3.sh 
#! /bin/bash

read -p "请输入一个字符或数字:" a
echo $a
#!/bin/bash

echo $2
ls $1*

[root@laiwenzhuo MyWorkSpace]# 

如果希望创建一个名为4.sh的文件,该文件包含上述三个文件的内容,可以把上面命令的输出重定向到新文件中:

[root@laiwenzhuo MyWorkSpace]# ls
1.sh  2.sh  3.sh  directory  dockerfile  echo.sh  for.sh  l  out.txt  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# cat 1.sh 2.sh 3.sh > 4.sh
[root@laiwenzhuo MyWorkSpace]# ls
1.sh  2.sh  3.sh  4.sh  directory  dockerfile  echo.sh  for.sh  l  out.txt  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# cat 4.sh 
#! /bin/bash

read -p "请输入一个字符或数字:" a
echo $a
#!/bin/bash

echo $2
ls $1*

如果希望创建一个新文件,并向其中输入一些内容,只需使用 cat命令把标准输出重定向 到该文件中,这时 cat命令的输入是标准输入 —键盘,你输入一些文字,输入完毕后按 < CTRL -D >结束输入。这真是一个非常简单的文字编辑器!

[root@laiwenzhuo MyWorkSpace]# cat > cat.txt
zhe shi yi ge wen jian
[root@laiwenzhuo MyWorkSpace]# cat cat.txt 
zhe shi yi ge wen jian

管道

可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一 般形式为:

命令1 |命令2

其中|是管道符号。

在这个例子中,接下 来grep命令在文件列表中搜索out.txt:

[root@laiwenzhuo MyWorkSpace]# ls | grep out.txt 
out.txt

tee

tee命令作用可以用字母 T来形象地表示。它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。

它的一般形式为: tee -a files 其中,- a表示追加到文件末尾。

#使用who命令,结果输出到屏幕上,同时保存在who.out文件中:
[root@laiwenzhuo MyWorkSpace]# cat out.txt 
[root@laiwenzhuo MyWorkSpace]# who | tee -a out.txt
root     pts/4        2020-07-15 14:14 (111.59.18.211:S.0)
[root@laiwenzhuo MyWorkSpace]# cat out.txt 
root     pts/4        2020-07-15 14:14 (111.59.18.211:S.0)

标准输入、输出和错误

当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描 述符来引用这些文件。由于文件描述符不容易记忆, shell同时也给出了相应的文件名。 下面就是这些文件描述符及它们通常所对应的文件名:

image-20200715171256419

系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、 输出和错误。可以任意使用文件描述符 3到9。

标准输入

标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。

标准输出

标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。

标准错误

标准错误是文件描述符 2。

这是命令错误的输出,缺省是屏幕,同样也可以是文件。你可 能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到 一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。 如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说 是你的终端)。

文件重定向

在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向

在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说, 这不是必需的。为了完整起见,我们在表 5-1中列出了两种方法。

image-20200715171519680

重定向标准输出
#ls命令的所有输出都被重定向到out.txt文件中,会覆盖原有内容:
[root@laiwenzhuo MyWorkSpace]# ls > out.txt 
[root@laiwenzhuo MyWorkSpace]# cat out.txt 
1.sh
2.sh
3.sh
4.sh
a.txt
b.txt
cat.txt
directory
dockerfile
echo.sh
for.sh
out.txt
test2.sh
test.sh
while.sh

#如果希望追加到已有的文件中 (在该文件不存在的情况下创建该文件 ),那么可以使用>>filename:
[root@laiwenzhuo MyWorkSpace]# ls >> out.txt 
[root@laiwenzhuo MyWorkSpace]# cat out.txt 
1.sh
2.sh
3.sh
4.sh
a.txt
b.txt
cat.txt
directory
dockerfile
echo.sh
for.sh
out.txt
test2.sh
test.sh
while.sh
#由于上边已经输出进去了,>> 直接再次追加
1.sh
2.sh
3.sh
4.sh
a.txt
b.txt
cat.txt
directory
dockerfile
echo.sh
for.sh
out.txt
test2.sh
test.sh
while.sh

如果想创建一个长度为0的空文件,可以用’ > filename ':

[root@laiwenzhuo MyWorkSpace]# ls
directory  dockerfile  echo.sh  for.sh  test2.sh  test.sh  while.sh
[root@laiwenzhuo MyWorkSpace]# >out.txt
[root@laiwenzhuo MyWorkSpace]# ls
directory  dockerfile  echo.sh  for.sh  out.txt  test2.sh  test.sh  while.sh
重定向标准输入

可以指定命令的标准输入。

可以把相应的文件作为该命令的参数

#例子,创建一个文件a,里面有无序的英文字母,通过sort指令进行排序之后输出到b文件中
[root@laiwenzhuo MyWorkSpace]# cat a.txt 
q
w
e
r
t
y
u
i
o
p
a
s
d
f
g
h
j
k
[root@laiwenzhuo MyWorkSpace]# sort< a.txt >b.txt
[root@laiwenzhuo MyWorkSpace]# cat b.txt 
a
d
e
f
g
h
i
j
k
l
o
p
q
r
s
t
u
w
y
重定向标准错误

为了重定向标准错误,可以指定文件描述符 2。让我们先来看一个例子,因为举例子往往 会让人更容易明白。在这个例子中, grep命令在文件miss中搜索abc字符串:

#grep命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件errormsg.log
[root@laiwenzhuo shell]# grep "abc" miss 2>>errormsg.log
[root@laiwenzhuo shell]# cat errormsg.log 
grep: miss: No such file or directory
结合使用标准输出和标准错误

一个快速发现错误的方法就是,先将输出重定向到一个文件中,然后再把标准错误重定 向到另外一个文件中

#我有两个文件,其中一个的确存在,而且包含一些信息,而另一个由于某种原因已经不存在了(但我不知道)。我想把这两个文件合并到allText.txt文件中。
[root@laiwenzhuo shell]# vim text1.txt
[root@laiwenzhuo shell]# cat text1.txt text2.txt 1>allText.txt 2>error.out
#现在如果出现了错误,相应的错误将会保存在 error.out文件中。
[root@laiwenzhuo shell]# cat error.out 
cat: text2.txt: No such file or directory
合并标准输出和标准错误

通过使用 2 > & 1就可以做到这一点,下面给出一个例子:

#将标准输出和标准错误重定向到同一个文件里,通过使用 2>&1就可以做到这一点,下面给出一个例子:
[root@laiwenzhuo shell]# grep "and" text1.txt text2.txt >allText.txt 2>&1 
[root@laiwenzhuo shell]# cat allText.txt 
text1.txt:Happiness is a way station between too much and too little.
grep: text2.txt: No such file or directory

符号链接

存在两种不同类型的链接,软链接和硬链接,这里我们只讨论软链接。软链接实际上就 是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。

命令的一般形式为:

ln [-s] source_path target_path

硬链接其实就是快速cp一份文件或文件夹,软连接类似于Windows中的快捷方式,一旦源文件移动或删除软连接就会失效

#硬链接
[root@laiwenzhuo MyWorkSpace]# ls
a.txt  date.out  directory  dockerfile  laiwenzhuo  shell
[root@laiwenzhuo MyWorkSpace]# ln date.out date2.out
[root@laiwenzhuo MyWorkSpace]# ls
a.txt  date2.out  date.out  directory  dockerfile  laiwenzhuo  shell

#软连接 ln -s
[root@laiwenzhuo MyWorkSpace]# ln -s date2.out date3.out
[root@laiwenzhuo MyWorkSpace]# ls
a.txt  date2.out  date3.out  date.out  directory  dockerfile  laiwenzhuo  shell
[root@laiwenzhuo MyWorkSpace]# ll
total 36
-rw-r--r-- 1 root root 10487 Jul 16 16:07 a.txt
-rw-r--r-- 2 root root  1479 Jul 16 17:24 date2.out
lrwxrwxrwx 1 root root     9 Jul 16 17:31 date3.out -> date2.out
-rw-r--r-- 2 root root  1479 Jul 16 17:24 date.out
drwxr-xr-x 2 root root  4096 Jul 14 14:49 directory
drwxr-xr-x 2 root root  4096 Jul 10 18:12 dockerfile
drwxr-xr-x 2 root root  4096 Jul 16 09:09 laiwenzhuo
drwxr-xr-x 2 root root  4096 Jul 16 17:10 shell

命令执行顺序

在执行某个命令的时候,有时需要依赖于前一个命令是否执行成功。例如,假设你希望 将一个目录中的文件全部拷贝到另外一个目录中后,然后删除源目录中的全部文件。在删除 之前,你希望能够确信拷贝成功,否则就有可能丢失所有的文件。

如果希望在成功地执行一个命令之后再执行另一个命令,或者在一个命令失败后再执行 另一个命令,&&和||可以完成这样的功能。相应的命令可以是系统命令或 shell脚本。 Shell还提供了在当前shell或子shell中执行一组命令的方法,即使用()和 { }。

使用&&

使用&&的一般形式为: 命令1 && 命令2 这种命令执行方式相当地直接。 &&左边的命令(命令1)返回真(即返回0,成功被执行) 后,&&右边的命令(命令 2)才能够被执行;换句话说,“如果这个命令执行成功 & &那么执 行这个命令”。

#例子
[root@laiwenzhuo shell]# cp text1.txt text2.txt && echo "文件复制成功"
文件复制成功
[root@laiwenzhuo shell]# ls
address.sh  echo.sh  error.out  for.sh  test2.sh  test.sh  text1.txt  text2.txt  while.sh
#在上面的例子中,&&前面的拷贝命令执行成功,所以 &&后面的命令(echo命令)被执行。

#在下面的例子中,对文件text1.txt进行cp操作,只有这一命令执行成功之后,文件text.txt才会被打印出来:
[root@laiwenzhuo test]# cp /home/MyWorkSpace/shell/text1.txt text.txt && cat text.txt
Whatever is worth doing is worth doing well.
Happiness is a way station between too much and too little.
In love folly is always sweet.
The hard part isn’t making the decision. It’s living with it.
Your happy passer-by all knows, my distressed there is no place hides.

使用||

使用||的一般形式为: 命令1 || 命令2

||的作用有一些不同。如果 ||左边的命令(命令 1)未执行成功,那么就执行 ||右边的命令 (命令2);或者换句话说,“如果这个命令执行失败了 || 那么就执行这个命令”。

#例子,
[root@laiwenzhuo test]# cp text1.txt text2.txt || echo "没有这个文件"
cp: cannot stat ‘text1.txt’: No such file or directory
没有这个文件

用()和{ }将命令结合在一起

**如果希望把几个命令合在一起执行, shell提供了两种方法。既可以在当前 shell也可以在 子shell中执行一组命令。 **

**为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令 用圆括号()括起来。 **

**它的一般形式为: (命令1;命令2;. . .) **

如果使用{ }来代替(),那么相应的命令将在子 shell而不是当前shell中作为一个整体被执 行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子 shell中执 行,否则在当前shell执行。它的一般形式为: {命令1;命令2;. . . } 我很少单独使用这两种方法。我一般只和 & &或| |一起使用这两种方法。

#下面的例子是复制文件text.txt 如果没有错误将打印 “复制成功”字符并且显示text1.txt文件内容
[root@laiwenzhuo test]# cp text.txt text1.txt && (echo "复制成功";cat text1.txt)
复制成功
Whatever is worth doing is worth doing well.
Happiness is a way station between too much and too little.
In love folly is always sweet.
The hard part isn’t making the decision. It’s living with it.
Your happy passer-by all knows, my distressed there is no place hides.

正则表达式

当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(RE),正则表达式 是一些特殊或不很特殊的字符串模式的集合。

使用句点匹配单字符

句点“.”可以匹配任意单字符。例如,如果要匹配一个字符串,以 an开头,中间夹一个 任意字符,那么可以表示为 an.,“.”可以匹配字符串头,也可以是中间任意字符。

#例子
[root@laiwenzhuo test]# grep -i "an." text.txt  
Happiness is a way station between too much and too little.

在行首以^匹配字符串或字符序列

^只允许在一行的开始匹配字符或单词。

#例子
#以T开头
[root@laiwenzhuo test]# grep -i "^t" text.txt  #-i 忽略大小写
The hard part isn’t making the decision. It’s living with it.
#以whatever开头
[root@laiwenzhuo test]# grep -i "^whatever" text.txt     #-i 忽略大小写
Whatever is worth doing is worth doing well.

#可以将各种模式结合使用,例如:
[root@laiwenzhuo test]# grep -i "^....eve." text.txt   
Whatever is worth doing is worth doing well.

在行尾以$匹配字符串或字符

#例子
#注意这里这个字符是以.结尾的
[root@laiwenzhuo test]# grep "well.$" text.txt 
Whatever is worth doing is worth doing well.

使用*匹配字符串中的单字符或其重复序列

使用此特殊字符匹配任意字符或字符串的重复多次表达式

[root@laiwenzhuo test]# grep "happ*" text.txt 
Your happy passer-by all knows, my distressed there is no place hides.

使用\屏蔽一个特殊字符的含义

有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。什么 是特殊字符?一般意义上讲,下列字符可以认为是特殊字符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QRBeJXkE-1595303939629)(C:\Users\HASEE\AppData\Roaming\Typora\typora-user-images\image-20200717163819384.png)]

#例子,比如我搜索以.txt结尾的文件,是可以搜索出来的
[root@laiwenzhuo test]# ls *.txt    
text.txt
#但是使用\屏蔽了*之后,就会把*当做一个普通字符
[root@laiwenzhuo test]# ls \*.txt  
ls: cannot access *.txt: No such file or directory

使用[]匹配一个范围或集合

使用[ ]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开,但并 不强制要求这样做(一些系统提倡在复杂的表达式中使用逗号),这样做可以增加模式的可读 性。 使用“-”表示一个字符串范围,表明字符串范围从“ -”左边字符开始,到“ -”右边字 符结束。

通过使用“-”符号可以简化操作: [0-9]

或任意小写字母 [a-z]

要匹配任意字母,则使用: [A-Za-z] 表明从A-Z、a-z的字母范围。

如要匹配任意字母或数字,模式如下: [A-Za-z0-9]

#匹配已w或W开头的字符
[root@laiwenzhuo test]# grep  "[wW]orth" text.txt   
Whatever is worth doing is worth doing well.

使用{}匹配模式结果出现的次数

使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用 \ { \ },此模式有三种 形式,即:

 pattern\{n\} 匹配模式出现n次。

 pattern\{n,\} 匹配模式出现最少n次。

 pattern\{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。

 请看第一个例子,匹配字母 A出现两次,并以B结尾,操作如下:

 A \ { 2 \ } B

 匹配值为AAB

 匹配A至少4次,使用: A \ { 4 , \ } B 

可以得结果A A A A B或A A A A A A A B,但不能为A A A B。 

如给出出现次数范围,例如 A出现2次到4次之间: 

A \ { 2 , 4 \ } B 

则结果为A A B、A A A B、A A A A B,而不是A B或A A A A A B等。
#要求,匹配前面4位是数字跟着XX后面4位是数字的字符
[root@laiwenzhuo test]# cat text2.txt 
1234XC9088
4523XX9001
0011XA9912
9931XC3445
[root@laiwenzhuo test]# grep "[0-9]\{4\}XX[0-9]\{4\}" text2.txt 
4523XX9001

grep 家族

相信grep是UNIX和LINUX中使用最广泛的命令之一。 grep(全局正则表达式版本)允许 对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。 grep支持基本正 则表达式,也支持其扩展集。 grep有三种变形,即:

Grep:标准grep命令,本章大部分篇幅集中讨论此格式。

Egrep:扩展grep,支持基本及扩展的正则表达式,但不支持 \q模式范围的应用,与之相对应的一些更加规范的模式,这里也不予讨论。

Fgrep:快速grep。允许查找字符串而不是一个模式。不要误解单词 fast,实际上它与grep 速度相当。

常用的g r e p选项有:

-c 只输出匹配行的计数。

-i 不区分大小写(只适用于单字符)。

-h 查询多文件时不显示文件名。

-l 查询多文件时只输出包含匹配字符的文件名。

-n 显示匹配行及行号。

-s 不显示不存在或无匹配文本的错误信息。

-v 显示不包含匹配文本的所有行。

从文件内容查找匹配指定字符串的行:

# grep "被查找的字符串" 文件名
[root@laiwenzhuo MyWorkSpace]# grep zhe cat.txt    
zhe shi yi ge wen jian

从文件内容查找与正则表达式匹配的行:

# grep –e "正则表达式" 文件名  #-e 将样式为延伸的正则表达式来使用。

查找时不区分大小写:

# grep –i "被查找的字符串" 文件名
[root@laiwenzhuo MyWorkSpace]# grep -i  zhE cat.txt  
zhe shi yi ge wen jian

查找匹配的行数:

# grep -c "被查找的字符串" 文件名 ,返回匹配到的字符串所在的行号
[root@laiwenzhuo MyWorkSpace]# grep -i -c  zhE cat.txt 
1

从文件内容查找不匹配指定字符串的行:

# grep –v "被查找的字符串" 文件名
[root@laiwenzhuo MyWorkSpace]# grep -i -v  "wo shi ge gui " cat.txt              
zhe shi yi ge wen jian

显示匹配行及行号

[root@laiwenzhuo test]# grep -i -n "^t" text.txt 
4:The hard part isn’t making the decision. It’s living with it.

显示非匹配行

#显示所有不包含以t字母开头的各行:
[root@laiwenzhuo test]# grep -i -n -v  "^t" text.txt
1:Whatever is worth doing is worth doing well.
2:Happiness is a way station between too much and too little.
3:In love folly is always sweet.
5:Your happy passer-by all knows, my distressed there is no place hides..

例子:从根目录开始查找所有扩展名为 .sh 的文本文件,并找出包含 “echo” 的行:

[root@laiwenzhuo MyWorkSpace]# find . -type f -name "*.sh" | xargs grep "echo"      
./1.sh:echo $a
./2.sh:echo $2
./echo.sh:echo -n "请输入一个字符或数字:"
./echo.sh:echo $s
./while.sh: echo $i
./for.sh:       echo $i
./4.sh:echo $a
./4.sh:echo $2

查询多个文件

#如果要在当前目录下所有.txt文件中查找以字符“t”开头的段落,方法如下:
[root@laiwenzhuo test]# grep -i -n "^t" *.txt
text_a.txt:4:The hard part isn’t making the decision. It’s living with it.
text.txt:4:The hard part isn’t making the decision. It’s living with it.

精确匹配

#使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加 \>。假定现在精确抽取 48,方法如下:
[root@laiwenzhuo test]# grep "48\>" text_b.txt 
48      Dec     3BC1997 LPSX    68.00 LVX2A 138

模式范围

#使用正则表达式抽取以48开头,以3或4结尾的字段
[root@laiwenzhuo test]# grep "48[34]" text_b.txt   
483     Sept    5AP1996 USP     65.00 LVX2C 189
484     nOv     7PL1996 CAD     49.00 PLV2C 234
483     may     5PA1998 USP     37.00 KVM9D 644

不匹配行首

#使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始。
[root@laiwenzhuo test]# grep "^[^48]" text_b.txt      
219     dec     2CC1999 CAD     23.00 PLV2C 68
216     sept    3ZL1998 USP     86.00 KVM9E 23

使用grep匹配“与”或者“或”模式

#grep命令加-E参数,这一扩展允许使用扩展模式匹配。
[root@laiwenzhuo test]# grep -E "219|216" data.f    
219     dec     2CC1999 CAD     23.00 PLV2C 68
216     sept    3ZL1998 USP     86.00 KVM9E 23

#或
[root@laiwenzhuo test]# egrep "219|216" data.f 
219     dec     2CC1999 CAD     23.00 PLV2C 68
216     sept    3ZL1998 USP     86.00 KVM9E 23
[root@laiwenzhuo test]# cat filename.deposit 
yrend.AS
mothdf
soa.PP
qp.RR
[root@laiwenzhuo test]# grep "[a-z]\{1,6\}\.[A-Z]\{1,2\}" filename.deposit
yrend.AS
soa.PP
qp.RR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值