shell-sed、awk、grep三剑客常用场景

一、搜索某目录下包含某字符串的所有文件名称

grep -r -l "func main()" "$src_dir" --include="*.go"

作用:返回src_dir下包含字符串func main()的所有go文件的文件名,返回结果支持for循环遍历
-r:表示递归
-l:表示只返回文件名,不返回匹配行

二、在文件的某一行下、上方添加代码

sed -i '/import (/a\
        "cloud.xxx.com/cover-sdk-go/sdk"\
        cover_agent "cloud.xxx.com/cover-sdk-go/sdk/agent"' "$main_file"

作用:在import(的下方添加包的引入代码,换行要在末尾加上
-i: 表示原地修改
/import/: / 是搜索的模式,sed 命令会找到包含这个模式的行
a: 表示在找到的行后面添加新的文本

sed -i '/^%clean/i\
mkdir -p \/xx\/code\
apps="utils exporter rrd-adapter"\
for app in $apps; do\n\
    echo "cover build for $app"\
    # 构建覆盖率、代码目录\
    mkdir -p ${RPM_BUILD_ROOT}\/xx/coverage\/${app}\
    # 拷贝app到\/xx\/code下\
    cp -r %{_builddir}\/%{name}\/$app \/xx\/code\/${app}\
    # 进入目录执行编译\
    (cd \/xx\/code\/$app && make -I ${COMMON_MAKEFILE_DEP_DIR} install)\
    # 拷贝代码到rpmbuild\/xx\/code\/{app}下\
    cp -r \/xx\/code\/$app ${RPM_BUILD_ROOT}\/xx\/code\/${app}\
done' $file

作用:在%clean上方添加代码

三、搜索某目录下文件名匹配某字符的所有文件

find "$src_dir" -type f \( -name "make.sh" -o -name "Makefile" \)

作用:找到src_dir下所有名称为make.sh和Makefile的文件
-type f 是一个选项,表示只查找文件,不包括目录。
( 和 ) 是转义字符,用于指示括号的字面值,因为在 shell 中,括号有特殊的含义。括号内的内容表示一个完整的条件表达式。
-name “make.sh” 和 -name “Makefile” 是查找的条件,表示文件名必须是 make.sh 或 Makefile。
-o 是逻辑 OR 操作符,表示满足任一条件的文件都将被查找出来

四、提取/删除文件指定两行代码之间的代码

awk '/^%install/, /^%clean/' "$file" | sed '1d;$d' | grep -v '^cd'

作用:提取%install到%clean之间的所有代码,并删除以cd开头的行
awk ‘/^%install/, /^%clean/’ “$file”: 提取%install到%clean的所有代码(包含%install和%clean)
sed ‘1d:$d’: 删除第一行和最后一行(%install和%clean)
grep -v ‘^cd’: 只保留不以cd开头的代码

sed -i '/^%install/,/^%clean/{//!d}' "$file"

sed -i '/%install/,/%clean/:匹配%install到%clean的所有行
{}:表示指定集合
//!d:不以 %install 开头和不以 %clean 开头的行)执行删除操作(d 命令)

五、插入包含变量的代码

场景二中我们可以通过sed命令往文件的指定位置插入代码,但是当我们插入的代码需要包含变量内容时,比如我们提取了某些代码到一个变量中,我们想把这个变量放在模板中插入到文件里,就不能再使用sed了。

# 假设你的模板是这样的
template_part1="这是模板的第一部分,我们想在这里插入 pkg_code 的内容"
template_part2="这是模板的第二部分"

# 使用 printf 将变量的内容预处理一下,以便它可以作为 sed 命令的输入
pkg_code_escaped=$(printf '%s\n' "$pkg_code" | sed 's:[][\/.^$*]:\\&:g')

# 使用 sed 命令在指定位置插入内容
sed -i "/INSERT_HERE/a $template_part1\n$pkg_code_escaped\n$template_part2" filename

简单来讲,就是变量需要通过printf和sed进行预处理后得到新的变量,将新的变量插入到模板中
方式二:build_insert会生成一个带有变量的多行字符串

insert_string=$(build_insert_string "$app" "$pkg_code")
printf "%s\n" "$insert_string" | sed -i '/^%install/ r /dev/stdin' "$file"

相关推荐

  1. shell-sed、awk、grep剑客场景

    2024-07-17 02:58:03       17 阅读
  2. Shell剑客:sed(简介)

    2024-07-17 02:58:03       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 02:58:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 02:58:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 02:58:03       58 阅读
  4. Python语言-面向对象

    2024-07-17 02:58:03       69 阅读

热门阅读

  1. Butch Wilmor与Sunny Williams升空计划截停?

    2024-07-17 02:58:03       19 阅读
  2. MySQL面试题-索引篇

    2024-07-17 02:58:03       22 阅读
  3. ES6 对象的新增方法(十四)

    2024-07-17 02:58:03       20 阅读
  4. powerShell相关

    2024-07-17 02:58:03       16 阅读
  5. Set接口

    2024-07-17 02:58:03       17 阅读
  6. 【Pandas】-Series数据类型

    2024-07-17 02:58:03       25 阅读
  7. 高程值的二维数组生成tiff栅格文件格式

    2024-07-17 02:58:03       27 阅读
  8. C#WPF DialogHost.Show 弹出对话框并返回数据

    2024-07-17 02:58:03       20 阅读
  9. QSFPDD光模块文档解析

    2024-07-17 02:58:03       21 阅读
  10. 【Python 项目】照片马赛克 - 3

    2024-07-17 02:58:03       24 阅读
  11. 如何衡量机器学习分类模型(python)

    2024-07-17 02:58:03       22 阅读
  12. Backend - Dockerfile 镜像档

    2024-07-17 02:58:03       24 阅读