shell中打印出文件匹配行(总数)和匹配的第N行

有时候我们需要两个文件来记录已执行过和待执行的记录,这个时候我们需要找到已执行文件中具有某种特征的行,以此来确定下一个执行任务,比如:
已执行记录文件executed_records.txt文件内容
shell中打印出文件匹配行(总数)和匹配的第N行_第1张图片
待执行记录文件execute_records.txt文件内容
shell中打印出文件匹配行(总数)和匹配的第N行_第2张图片
当匹配到的待执行任务m大于匹配到的已执行任务n时,即m>n时,执行下一个待执行任务,下一个待执行任务就是待执行任务中匹配到的第n+1条记录。下面测试以execute_records.txt文件为例。

1. 打印匹配内容

sed -n -e '/Server-01/p' execute_records.txt

shell中打印出文件匹配行(总数)和匹配的第N行_第3张图片

2. 打印匹配内容行号

sed -n -e '/Server-01/=' execute_records.txt

shell中打印出文件匹配行(总数)和匹配的第N行_第4张图片

3. 打印出匹配的行号与内容

sed -n ' /Server-01/{= ; p} ' execute_records.txt

shell中打印出文件匹配行(总数)和匹配的第N行_第5张图片

4. 打印出匹配结果中的2-4行

sed -n '/Server-01/p' execute_records.txt |sed -n 2,4p

在这里插入图片描述

5. 将文件中2到4行中匹配的数据显示出来

sed -n '/Server-01/{2,4p}' execute_records.txt

在这里插入图片描述

6. 打印匹配行总数

方式一:(不推荐)将输出结果存为数组,数组长度就是匹配行总数。

array=(`sed -n -e '/Server-01/=' executed_records.txt`)
echo ${#array[@]}

在这里插入图片描述
这里的6其实就是Server-01这台机器待执行任务记录为6,已执行记录同样可以通过查询得到,查询结果为4。
这个时候6>4,下一任务就是匹配内容的第五条。利用第3中提到的命令sed -n '/Server-01/p' execute_records.txt |sed -n 4p找到第五条待执行任务的记录,截取任务文件名20200101.db.000005.sql,将该文件内容写入数据库,并记录该任务到已执行记录文件中。
方式二:(推荐)用find结果wc -l来统计匹配的行数。

find execute_records.txt -type f -exec grep -H "Server-01" {
     } \; | wc -l

在这里插入图片描述

-type f 表示搜索的是文件 (-type d 则是目录,具体man find)

-exec   {} \;   表示对找到的每一个文件名执行    ,

注意 {} 会被find替换成找到的文件名, \; 是必须的,用来标记 -exec 的终结

grep -H   中搜索 , -H 表示在每一个匹配行前打印出文件名

wc -l  

统计  中的行数

参考:https://zhidao.baidu.com/question/35794423.html

你可能感兴趣的:(shell,自动化运维,shell)