grep命令不搜索完整模式

时间:2013-06-25 07:52:54

标签: shell

我在shell脚本中使用grep命令时遇到问题。实际上我有一个文件(PCF_STARHUB_20130625_1),其中包含以下记录。

SH_5.55916.00.00.100029_20130601_0001_NUC.csv.gz|438|3556691115
SH_5.55916.00.00.100029_20130601_0001_Summary.csv.gz|275|3919504621
SH_5.55916.00.00.100029_20130601_0001_UI.csv.gz|226|593316831
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_NUC.csv.gz|368|3553014997
SH_5.55916.00.00.100038_20130601_0001_Summary.csv.gz|276|2625719449
SH_5.55916.00.00.100038_20130601_0001_UI.csv.gz|226|3825232121
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349
SH_5.75470.00.00.100015_20130601_0001_NUC.csv.gz|425|1627227450

我有一个模式存储在一个变量(INPUT_FILE_T)中,并希望从文件中搜索模式(PCF_STARHUB_20130625_1)。为此,我使用了以下命令

INPUT_FILE_T="SH?*???????????????US.*"
grep ${INPUT_FILE_T} PCF_STARHUB_20130625_1 

以上命令的输出如下:

PCF_STARHUB_20130625_1:SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234

我在输出中有两个问题,第一个是输出中只显示一个条目(它应该包含两个条目),第二个问题是,输出包含“PCF_STARHUB_20130625_1:”,它不应该出现。输出应该如下所示

SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

除了grep之外是否有任何技术请告诉我。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

将数据复制到input.txt

$> (export INPUT_FILE_T="SH.*US\.*"; grep -h ${INPUT_FILE_T} input.txt)
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

修改

如果你绝对必须使用glob模式,可能会有一个实用程序,但我不知道。以下快速C程序将有所帮助:

#include <fnmatch.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 4096

int main(int argc, char**argv)
{
    if (argc < 2) { return EXIT_FAILURE; }

    FILE *in = stdin;
    const char *pattern = argv[1];

    char line[MAX_LINE_LENGTH + 1];
    while (fgets(line, MAX_LINE_LENGTH, in))
    {
        if (!fnmatch(pattern, line, 0))
        {
            printf("%s", line);
        }
    }
    return EXIT_SUCCESS;
}

编译(上述程序在文件myfnmatch.c中):

$> gcc -Wall myfnmatch.c -o myfnmatch

实例用法(请注意stdininput.txt的重定向):

(export INPUT_FILE_T="SH?*???????????????US.*"; ./myfnmatch ${INPUT_FILE_T} <./input.txt)
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349

答案 1 :(得分:0)

您可以使用.*任意次数匹配任何字符,因此您的搜索模式可以简化(也不需要最后一个通配符):

INPUT_FILE_T="SH.*US\."

要从输出中删除文件名,请使用-h标志grep:

$ grep -h ${INPUT_FILE_T} PCF_STARHUB_20130625_1
SH_5.55916.00.00.100029_20130601_0001_US.csv.gz|349|1700116234
SH_5.55916.00.00.100038_20130601_0001_US.csv.gz|199|2099616349