吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 559|回复: 17
收起左侧

[求助] 请教一下Linux命令grep -P参数与正则表达式的过滤语法

[复制链接]
chlryg 发表于 2024-3-26 21:25
220吾爱币
[Bash shell] 纯文本查看 复制代码
Ctgzalk@Ubuntu:~$ cat -n log_2024-03-26_143126.csv
     1  2024-03-26 15:09,B列数值,C列数值,D列数值,14.18,F列数值,24,H列数值,I列数值
     2  2024-03-26 15:09,B列数值,C列数值,D列数值,5,F列数值,34,H列数值,I列数值
     3  2024-03-26 15:09,B列数值,C列数值,D列数值,9,F列数值,35,H列数值,I列数值
     4  2024-03-26 15:09,B列数值,C列数值,D列数值,2,F列数值,30,H列数值,I列数值
     5  2024-03-26 15:09,B列数值,C列数值,D列数值,3,F列数值,24,H列数值,I列数值
     6  2024-03-26 15:09,B列数值,C列数值,D列数值,5,F列数值,24,H列数值,I列数值
     7  2024-03-26 15:09,B列数值,C列数值,D列数值,5.01,F列数值,24,H列数值,I列数值
     8  2024-03-26 15:09,B列数值,C列数值,D列数值,6,F列数值,24,H列数值,I列数值
     9  2024-03-26 15:09,B列数值,C列数值,D列数值,0,F列数值,24,H列数值,I列数值
    10  2024-03-26 15:09,B列数值,C列数值,D列数值,205.01,F列数值,24,H列数值,I列数值
    11  2024-03-26 15:09,B列数值,C列数值,D列数值,1,F列数值,24,H列数值,I列数值
    12  2024-03-26 15:09,B列数值,C列数值,D列数值,1,F列数值,24,H列数值,I列数值
    13  2024-03-26 15:09,B列数值,C列数值,D列数值,5.001,F列数值,24,H列数值,I列数值
    14  2024-03-26 15:09,B列数值,C列数值,D列数值,5.01,F列数值,24,H列数值,I列数值
    15  2024-03-26 15:09,B列数值,C列数值,D列数值,5.1,F列数值,35,H列数值,I列数值
    16  2024-03-26 15:09,B列数值,C列数值,D列数值,3,F列数值,40,H列数值,I列数值
    17  2024-03-26 15:09,B列数值,C列数值,D列数值,10,F列数值,38,H列数值,I列数值
    18  2024-03-26 15:09,B列数值,C列数值,D列数值,11.2,F列数值,0,H列数值,I列数值
Ctgzalk@Ubuntu:~$
Ctgzalk@Ubuntu:~$ head log_2024-03-26_144157.csv log_2024-03-26_152741.csv
==> log_2024-03-26_144157.csv <==
2024-03-26 15:09,B列数值,C列数值,D列数值,4,F列数值,24,H列数值,I列数值
2024-03-26 15:09,B列数值,C列数值,D列数值,4.01,F列数值,24,H列数值,I列数值
2024-03-26 15:09,B列数值,C列数值,D列数值,1.00,F列数值,35,H列数值,I列数值
2024-03-26 15:09,B列数值,C列数值,D列数值,11.2,F列数值,43,H列数值,I列数值

==> log_2024-03-26_152741.csv <==
2024-03-26 15:09,B列数值,C列数值,D列数值,10,F列数值,24,H列数值,I列数值
2024-03-26 15:09,B列数值,C列数值,D列数值,10.0,F列数值,24,H列数值,I列数值
2024-03-26 15:09,B列数值,C列数值,D列数值,6.01,F列数值,30,H列数值,I列数值
Ctgzalk@Ubuntu:~$

如下图所示,Linux系统的某目录下有多个.csv文件,我需要从这些csv文件中过滤出异常的行(异常的判定条件是csv的第五列出现连续三行大于5的值或者第七行出现连续三行大于32的值),若出现异常的行则需要将这三行(或三行以上的文本)>>到一个.log文件里
正则表达式琢磨了一下午也没写明白,因为第五列和第七列会出现5.0/5.001/5.1,32.0/32.0000001/32.065562这种数值,导致正则的逻辑匹配到了错误的数值,所以来请教一下各位



像是5.0000是不大于5的,5.000001是大于5的
如awk命令查询的结果为例说明,按照预期的判断逻辑,上面的三个csv文件只有143126的csv的第13、14、15行(第五列值),第15、16、17行(第七列值)以及152741csv的1、2、3行(第五列值)这三处是符合匹配条件;像是144157csv文件第4行的第五列值11.2与下方的10/10.0不能算作符合匹配条件,因为这三行数值分别属于两个csv文件

最佳答案

查看完整内容

提供个菜鸡的正则思路,希望不要嫌弃,我用的比较简答粗暴的方式,如果不行的话希望大佬帮我指正一下,我假设匹配在边界,如果前面有固定的格式比如,比如空白符可以替换一下

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

LittiePang 发表于 2024-3-26 21:25
提供个菜鸡的正则思路,希望不要嫌弃,我用的比较简答粗暴的方式,如果不行的话希望大佬帮我指正一下,我假设匹配在边界,如果前面有固定的格式比如,比如空白符可以替换一下E:\work\解答.jpg
解答.jpg
 楼主| chlryg 发表于 2024-3-26 21:28
正则配合grep命令支持这样的判断逻辑吗?先去csv里判定数值范围,把满足条件的行拿出来再判断是否是同一文件里连续三行出现了符合条件的数值
Andrea 发表于 2024-3-26 21:51
本身处理浮点数就不友好,可以考虑给他搞个算术运算,比如求个模
1393301815 发表于 2024-3-26 22:19
#!/bin/bash
for csvfile in *.csv; do
    awk -F, '{
        e5 = e7 = 0
        if ($5 > 5) {
            c5++
            if (c5 >= 3) {
                e5 = 1
            }
        } else {
            c5 = 0
        }
        if ($7 > 32) {
            c7++
            if (c7 >= 3) {
                e7 = 1
            }
        } else {
            c7 = 0
        }
        if (e5 || e7) {
            buf[NR] = $0
        }
        if (NR > 3) {
            delete buf[NR-3]
        }
        if (e5 || e7) {
            for (i=NR-2; i<=NR; i++) {
                if (buf[i]) print buf[i] >> "anomaly.log"
            }
        }
    }' $csvfile
done
 楼主| chlryg 发表于 2024-3-26 23:21
1393301815 发表于 2024-3-26 22:19
#!/bin/bash
for csvfile in *.csv; do
    awk -F, '{

大佬,要求通过一行grep命令,这Shell脚本不行的o(o&#65381;`з&#65381;&#180;o)&#65417;!!!
 楼主| chlryg 发表于 2024-3-26 23:22
Andrea 发表于 2024-3-26 21:51
本身处理浮点数就不友好,可以考虑给他搞个算术运算,比如求个模

正则没有办法匹配浮点数码
zhufengwan 发表于 2024-3-27 01:27
是不是配合上 awk 能够实现你这个需求,可以研究研究 awk
1393301815 发表于 2024-3-27 07:03
chlryg 发表于 2024-3-26 23:21
大佬,要求通过一行grep命令,这Shell脚本不行的o(o&#65381;`з&#65381;&#180;o)&#65417;!!!

你的要求一行很难实现啊
Andrea 发表于 2024-3-27 08:13
chlryg 发表于 2024-3-26 23:22
正则没有办法匹配浮点数码

目前没找到合适的方式处理浮点数,需要判断浮点数,大多是额外加工一下,或者用其他语言的脚本处理。awk 过滤后,给他算一下,这是目前我能想到的比较合适的方式了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 22:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表