Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell脚本-按将显示的列筛选文本文件(&;不会存在_Shell_Unix - Fatal编程技术网

Shell脚本-按将显示的列筛选文本文件(&;不会存在

Shell脚本-按将显示的列筛选文本文件(&;不会存在,shell,unix,Shell,Unix,我想根据用户的输入(例如:1218738496),根据第8列过滤一个充满日志文件的目录,并输出到文本文件。我有一个可行的解决方案,但我正在寻找一个性能更好的解决方案,因为总文件大小可能超过1GB+ 问题1: 某些行的格式不一致 问题2: 如果行的第8列与输入匹配,则它下面的行(不包含INSERT)也应输出到文件 样本数据 ACTION,INSTALLATION_ID,LOG_TIMESTAMP_SECONDS,LOG_TIMESTAMP_FRACTIONS,LOG_TIMESTAMP,THREA

我想根据用户的输入(例如:1218738496),根据第8列过滤一个充满日志文件的目录,并输出到文本文件。我有一个可行的解决方案,但我正在寻找一个性能更好的解决方案,因为总文件大小可能超过1GB+

问题1: 某些行的格式不一致

问题2: 如果行的第8列与输入匹配,则它下面的行(不包含INSERT)也应输出到文件

样本数据

ACTION,INSTALLATION_ID,LOG_TIMESTAMP_SECONDS,LOG_TIMESTAMP_FRACTIONS,LOG_TIMESTAMP,THREAD_ID,SEQUENCE_NUMBER,LOG_LEVEL_TYPE
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1127192896,0,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:13.305 (Asia/Colombo),1127192896,1,DEBUG1
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3
操作、安装ID、日志时间戳秒、日志时间戳分数、日志时间戳、线程ID、序列号、日志级别类型
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1127192896,0,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:13.305(亚洲/科伦坡),1127192896,1,调试1
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,14,调试3
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,15,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,17,调试3
期望输出

INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3
INSERT,SLT_TEST_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,14,3
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,15,调试3
0010:69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]“,,默认值,false”
插入,SLT_测试_12015/06/02 14:07:26.860(亚洲/科伦坡),1218738496,17,调试3
我当前的工作脚本

for file in $(ls -rt $directory)
do
    echo "Reading file : " $file
     # || [[ -n "$line" ]] <-- prevent last line being ignored if doesn't end with newline
    while IFS= read -r line || [[ -n "$line" ]]
    do 
        # if line contains INSERT
        if [[ $line == *"INSERT"* ]]
        then
            # Break it to access the thread ID
            breakdown=(${line//,/ })
            threadID=${breakdown[4]}

            if [[ $threadID == "$inputThreadID" ]]
            then
                seqID=${breakdown[5]}
                echo $line >> ./output_unsorted.txt
            fi
        else
            # The "too long lines" check if they belong to the ID log we want
            if [ "$threadID" == "$inputThreadID" ] && [[ $line != *"ACTION,INSTALLATION_ID"* ]]
            then
                if [ "$lastSeqID" != "$seqID" ]
                then
                    echo $line >> ./output_unsorted.txt
                else
                    echo $line >> ./output_unsorted.txt
                fi
            fi
        fi
    done < "$directory/$file"
done
$中文件的
(ls-rt$目录)
做
echo“正在读取文件:$file”
#| |[-n“$line”]]使用awk
这将生成您要求的输出:

$ awk -F, '/INSERT/{f=0} $4==1218738496{f=1} f' file
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,14,DEBUG3
<v s=""MONTHLY_PEAK_DWNLOAD""/>
</a><a n=""thresholdScheme""><o t=""PM_UsageMonitorConfigThreshold"">
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,15,DEBUG3
0010: 69 6c 65 40 10 92 0f 0e 67 b9 72 aa 5d e1 03 63
]",,default,false
INSERT,SLT_TEST_1,2015/06/02 14:07:26.860 (Asia/Colombo),1218738496,17,DEBUG3

有什么能阻止你在Perl中这样做吗?在我看来,这比bash更合适。不幸的是,我只能在bash中这样做:(嗨,知道为什么这样做不起作用吗?output.txt是空的。
对于$(ls-rt$2)do awk-F',/INSERT/{F=0}$4==1218738496{F=1}F'$2$file中的文件“>./output.txt完成
有几个问题。为了解决这些问题,
$2
最好以一个
/
结束。此外,对于找到的每个文件,所有以前的输出都将丢失,因为每次都会从头覆盖
/output.txt
。(如果您希望将其附加到,请将
>
替换为
>
)此外,如果任何文件或目录名包含空格,则该代码将不起作用。谢谢,一旦我将>替换为>>
#!/bin/bash
f=
while IFS= read line
do
    [[ $line == *"INSERT"* ]] && f=
    IFS=, read a b c d rest <<<"$line"
    [ "$d" = 1218738496 ] && f=1
    [ "$f" ] && echo "$line"
done <file