文章目录
- 20221011 grep如何匹配多个标志?
- 20230412 grep -q(`Use grep -q instead of comparing output with [ -n .. ].`警告)
- 20230421 匹配前后空格`\s`
参考文章: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 9月 29 14:59 Desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Documents
drwxr-xr-x 2 ubuntu ubuntu 4096 9月 27 16:19 Downloads
-rw-r--r-- 1 ubuntu ubuntu 8980 12月 24 2020 examples.desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Music
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Pictures
drwxrwxr-x 3 ubuntu ubuntu 4096 10月 10 11:40 projects
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Public
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Templates
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Videos
drwxrwxr-x 8 ubuntu ubuntu 4096 12月 24 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 9月 29 14:59 Desktop
-rw-r--r-- 1 ubuntu ubuntu 8980 12月 24 2020 examples.desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Music
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 2020 Pictures
drwxr-xr-x 2 ubuntu ubuntu 4096 12月 24 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 … ].
20230421 匹配前后空格\s
如下,用grep "\s$NODE_PRJ_NAME\s"
能匹配搜索内容的前后空格
注意:
在正则表达式中,空格可以用空格字符
" "
或者元字符"\s"
来匹配。它们的区别在于:
1、" "
只能匹配空格字符,而"\s"
可以匹配任何空白字符,包括空格、制表符、换行符等。
2、" "
只能匹配一个空格字符,而"\s"
可以匹配一个或多个空白字符。
因此,如果要匹配任何空白字符,应该使用"\s"
;如果只需要匹配空格字符,可以使用" "
。
# 用 pm2 启动 node 项目
echo "Start node prj ..."
# 判断进程是否在运行
# if $PM2 list | grep -q "\s$NODE_PRJ_NAME\s"; then
if pm2 list | grep -q "\s$NODE_PRJ_NAME\s"; then
echo
# $PM2 list
pm2 list
echo
echo "进程 $NODE_PRJ_NAME 已经在运行"
read -p "是否停止并删除进程?[y/n]" choice
case "$choice" in
y | Y)
echo
echo "停止并删除进程 $NODE_PRJ_NAME ..."
echo
# $PM2 stop $NODE_PRJ_NAME && $PM2 delete $NODE_PRJ_NAME
pm2 stop $NODE_PRJ_NAME && pm2 delete $NODE_PRJ_NAME
;;
*)
exit 0
;;
esac
fi