我在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之外是否有任何技术请告诉我。
请帮我解决这个问题。
答案 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
实例用法(请注意stdin
到input.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