> 文章列表 > grep命令详解(如何匹配多个字符串)(grep指令)(grep -q)

grep命令详解(如何匹配多个字符串)(grep指令)(grep -q)

grep命令详解(如何匹配多个字符串)(grep指令)(grep -q)

文章目录

    • 20221011 grep如何匹配多个标志?
    • 20230412 grep -q(`Use grep -q instead of comparing output with [ -n .. ].`警告)

参考文章:grep命令详解

| grep -c [被搜索文本]	# 统计被搜索文本出现的次数

参考文章:Linux中用grep命令来搜索单词及统计匹配的行数

20221011 grep如何匹配多个标志?

参考文章:Linux shell:grep命令查找多个字符串(grep同时匹配多个关键字或任意关键字)

[命令] | grep '[pattern1]\\|[pattern2]'

注意\\|跟前后pattern要连着

如,在我们的英伟达盒子上:

root@nx-desktop:/home/ubuntu# ls -l
total 52
drwxr-xr-x 5 ubuntu ubuntu 4096 929 14:59 Desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Documents
drwxr-xr-x 2 ubuntu ubuntu 4096 927 16:19 Downloads
-rw-r--r-- 1 ubuntu ubuntu 8980 1224  2020 examples.desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Music
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Pictures
drwxrwxr-x 3 ubuntu ubuntu 4096 1010 11:40 projects
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Public
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Templates
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Videos
drwxrwxr-x 8 ubuntu ubuntu 4096 1224  2020 VisionWorks-SFM-0.90-Samples
root@nx-desktop:/home/ubuntu# 
root@nx-desktop:/home/ubuntu# ls -l | grep 'op\\|ic'
drwxr-xr-x 5 ubuntu ubuntu 4096 929 14:59 Desktop
-rw-r--r-- 1 ubuntu ubuntu 8980 1224  2020 examples.desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Music
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Pictures
drwxr-xr-x 2 ubuntu ubuntu 4096 1224  2020 Public
root@nx-desktop:/home/ubuntu# 
root@nx-desktop:/home/ubuntu# 

在海康摄像头里:

ls
bin      dev      heop     lib      proc     sys      var
dav      etc      home     linuxrc  sbin     usr
# # ls -l | grep 'b\\|e'
ls -l | grep 'b\\|e'
drwxrwxr-x    2 1006     1008          1260 Sep 27 09:58 bin
drwxrwxrwt   15 0        0             5180 Sep 27 09:58 dev
drwxr-xr-x    2 0        0              100 Oct  9 17:30 etc
drwxr-xr-t    3 0        0               60 Oct  9 17:30 heop
drwxr-xr-t    6 0        0              120 Oct  9 17:30 home
drwxr-xr-x    4 0        0             4060 Sep 27 09:58 lib
lrwxrwxrwx    1 0        0               11 Sep 27 09:58 linuxrc -> bin/busybox
drwxrwxr-x    2 1006     1008           180 Sep 27 09:58 sbin
drwxrwxr-x    6 1006     1008           120 Sep 27 09:58 usr
# 

20230412 grep -q(Use grep -q instead of comparing output with [ -n .. ].警告)

示例:

if ! docker images | awk '{print $1":"$2}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then# do something if the image does not exist
else# do something if the image exists
fi

grep -q是grep命令的一个选项,它的作用是在查找匹配项时不输出任何内容,只返回一个退出状态码。如果找到匹配项,则返回0,否则返回1。

在if语句中,我们可以使用grep -q来检查某个条件是否成立,而不必在标准输出中显示任何内容。这样可以提高脚本的效率和可读性。

在我们之前的例子中,grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"用于检查docker images的输出是否包含IMAGE_NAME和IMAGE_TAG的组合。如果存在,则if语句返回true,否则返回false。由于我们只关心是否存在匹配项,而不关心具体的匹配内容,因此使用grep -q可以避免不必要的输出和处理。

注意:if ! docker images | awk '{print $1":"$2}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$";不要改成if ! $(docker images | awk '{print $1":"$2}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$");因为在if语句中,我们只需要检查命令的退出状态码,而不需要将其输出作为if语句的条件。因此,可以直接使用if ! docker images | awk '{print $1":"$2}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"来检查镜像是否不存在。

这个细节来源于一个shellcheck的警告:SC2143 – ShellCheck Use grep -q instead of comparing output with [ -n … ].