在查找和使用管道中调用外部命令

Calling external command in find and using pipe

我想知道是否有一种方法可以在 AIX 6.x 上使用 find 命令从某个目录(包括子目录)搜索所有文件,然后再调用外部命令(例如 hlcat)[=25] =] 将它们转换为可读格式,然后可以通过 grep 命令进行管道传输以查找模式,而不是在 shell?

中使用循环
e.g. find . -type f -name “*.hl7” -exec hlcat {} | grep -l “pattern” \;

上面的命令不起作用,我必须使用 while 循环来显示内容并搜索模式,如下所示:

find . -type f -name “*.hl7” -print | while read file; do
hlcat $file | grep -l “pattern”;
done

同时,这些 HL7 文件已用圆括号重命名,这样可以防止在文件名周围没有双引号的情况下打开它们。

e.g. hlcat (patient) filename.hl7 will fail to open.
        hlcat “(patient) filename.hl7” will work.

简而言之,我正在查找命令中寻找一种干净简洁的单行方法,并查看和搜索这些带有圆括号名称的 HL7 文件的内容。

非常感谢, 乔治

P.S。 HL7原始数据由一条连续的线组成,不可读,除非使用hlcat等工具将其转换成可读的格式。 在

更新:简单的方法

find . -type f -name '*.hl7' -exec grep -iEl 'Barry|Jolene' {} +

注意: 不过您可能会得到一些误报。请参阅下文进行有针对性的搜索。


正在一堆 HL7v2 文件中搜索 名字

1。查看 HL7v2 文件格式

HL7 示例v2 PID 段:

PID|||56782445^^^UAReg^PI||KLEINSAMPLE^BARRY^Q^JR||19620910|M|||

PID段分解:

Seq NAME HHIC USE LEN
0 PID keyword Segment Type 3
3 Patient ID Medical Record Num 250
5 Patient Name Last^First^Middle 250
7 Date/Time Of Birth YYYYMMDD 26
8 Sex F, M, or U 1
2。编写有针对性的搜索

使用 grep (AIX):

find . -type f -name '*.hl7' -exec grep -iEl '^PID\|([^|]*\|){4}[^^|]*\^(Barry|Jolene)\^' {} +

awk:

find . -type f -name '*.hl7' -exec awk -v firstname='^(Barry|Jolene)$' '
    BEGIN { FS="|" }
    FNR == 1 { if( found ) print filename; found = 0; filename = FILENAME }
     == "PID" { split(, name, "^"); if (toupper(name[2]) ~ toupper(firstname)) { found = 1 } }
    END { if ( found ) print filename }
' {} +

备注: 这个 awk 解决方案的优点是您将 名字正则表达式 作为 参数。这个解决方案很容易扩展,例如搜索 last name.