小编kat*_*ayx的帖子

查找文件名是否包含 bash 脚本中的某个字符串

我在一个目录中有一堆输出文件,例如:a.out、b.out c.out 等。

我想搜索输出文件,如果输出文件名包含某个字符串(例如“a”),那么它会将相应的输出文件“a.out”打印到屏幕上。

在我 cd 进入输出文件目录后,这是我的代码:

OUT_FILE="*.out"
OT=$OUT_FILE
STRING="a"

for file in "$OT";do
  if [[$file == *"$STRING"*]];then
    echo $file
  fi
done
Run Code Online (Sandbox Code Playgroud)

我收到的错误是 [[*.out: command not found。看起来 $file 被解释为 $OT,而不是与 $OT 匹配的单个文件。

但是当我删除 if 语句并只执行 for 循环来回显每个 $file 时,输出给了我所有以 .out 结尾的文件。

希望得到一些帮助以了解我做错了什么。提前致谢。

bash

10
推荐指数
2
解决办法
2万
查看次数

使用 AWK 分割大文件,无法超过 252 个分割文件

我想根据正则表达式时间戳模式将一个大文件(7.5MB)拆分为多个较小的文件,并且该文件中有 566 个时间戳:

大文件由多个数据块组成,每个块包含:时间戳+数据,看起来像这样(第1行是第一个时间戳):

12/20/2022 23:18:56

blah
blah
blah
blah
blah
blah
12/20/2022 23:23:56

blah
blah
blah
12/20/2022 23:28:56
blah
...
...
...
Run Code Online (Sandbox Code Playgroud)

每个较小的分割文件应该只包含一个时间戳和一个数据块,例如:

12/20/2022 23:23:56

blah
blah
blah
Run Code Online (Sandbox Code Playgroud)

我用来awk查找每个时间戳,一旦找到,每个时间戳+数据都会写入分割文件,直到找到下一个时间戳,然后创建下一个分割文件:

regex='([0-9]{2}\/[0-9]{2}\/[0-9]{4})'
awk -v regex=$regex '$0 ~ regex{x="split"++i}; i > 0 {print > x;}' $bigfile
Run Code Online (Sandbox Code Playgroud)

这非常有效(即文件 split1-252 正是我所期望的),直到awk遇到第 253 次出现的时间戳,然后出现错误:

awk: can't open file split253
 source line number 1
Run Code Online (Sandbox Code Playgroud)

据我所知,第 253 个时间戳没有什么不同,因此我将第 253 个到第 566 个时间戳保存为一个新文件,因此新文件总共出现了 314 次时间戳模式,然后针对新文件重新运行我的代码文件。有趣的是,awk再次出错并显示完全相同的消息:

awk: can't open file split253
 source line …
Run Code Online (Sandbox Code Playgroud)

regex awk

3
推荐指数
1
解决办法
86
查看次数

标签 统计

awk ×1

bash ×1

regex ×1