日志解析器:使用文本文件作为 WHERE 子句中的输入
Log parser: Using a text file as an input in WHERE clause
我正在处理一个批处理脚本,我在其中使用 Log Parser 解析 IIS 日志。
所以,我在这里有 2 个问题:
Q1。我想要的是,不要看到在文本文件中写入用户名的条目。因此,可以更新该文本文件而不必担心代码语法。
换句话说,我不会一次又一次地使用 'AND' 将每个用户名(可能是 30-50 左右)放在 'WHERE' 子句中,我将有一个包含用户名列表的文本文件。
代码示例:
"LogParser.exe" -i:csv "SELECT DISTINCT date, cs-username, clientun, cs-uri-stem FROM D:\temp.csv WHERE NOT cs-username IN ('NULL';'abc';'def';'hij';'and_so_on')" >D:\final_output.txt -o:NAT -rtp:-1
我试图先通过子查询来做到这一点,但它似乎在日志解析器中不受支持。我发现 OPENROWSET 是一种解决方案 here,但这似乎对我不起作用,或者可能是我不知道如何让它起作用。
我找到的其他解决方案适用于 SQL,但不适用于日志解析器。
Q2。我希望在提到的日期之间读取日志。因此,我以 YYYY-MM-DD 格式从用户那里获取开始日期和结束日期,并将它们放入查询
"LogParser.exe" -i:iisw3c "SELECT DISTINCT cs-username, REVERSEDNS(C-IP), date, cs-uri-stem, FROM \logs\location\* WHERE date BETWEEN %date_1% AND %Date_2%" >D:\temp.csv -o:csv
我得到的错误是:
Error: WHERE clause: Semantic Error: left interval of BETWEEN operator ("'2016-02-15'") has a different type than operand ("date")
请注意,Q2 生成的输出文件用作 Q1 的输入。
Q1:不使用 logparser 过滤数据,而是使用 findstr
和 /g:file /v
开关来过滤输入文件或输出行(视情况而定)
Q2:字符串不是时间戳。使用
BETWEEN TO_TIMESTAMP('%date_1%','yyyy-MM-dd') AND TO_TIMESTAMP('%date_2%','yyyy-MM-dd')
我正在处理一个批处理脚本,我在其中使用 Log Parser 解析 IIS 日志。 所以,我在这里有 2 个问题:
Q1。我想要的是,不要看到在文本文件中写入用户名的条目。因此,可以更新该文本文件而不必担心代码语法。
换句话说,我不会一次又一次地使用 'AND' 将每个用户名(可能是 30-50 左右)放在 'WHERE' 子句中,我将有一个包含用户名列表的文本文件。
代码示例:
"LogParser.exe" -i:csv "SELECT DISTINCT date, cs-username, clientun, cs-uri-stem FROM D:\temp.csv WHERE NOT cs-username IN ('NULL';'abc';'def';'hij';'and_so_on')" >D:\final_output.txt -o:NAT -rtp:-1
我试图先通过子查询来做到这一点,但它似乎在日志解析器中不受支持。我发现 OPENROWSET 是一种解决方案 here,但这似乎对我不起作用,或者可能是我不知道如何让它起作用。 我找到的其他解决方案适用于 SQL,但不适用于日志解析器。
Q2。我希望在提到的日期之间读取日志。因此,我以 YYYY-MM-DD 格式从用户那里获取开始日期和结束日期,并将它们放入查询
"LogParser.exe" -i:iisw3c "SELECT DISTINCT cs-username, REVERSEDNS(C-IP), date, cs-uri-stem, FROM \logs\location\* WHERE date BETWEEN %date_1% AND %Date_2%" >D:\temp.csv -o:csv
我得到的错误是:
Error: WHERE clause: Semantic Error: left interval of BETWEEN operator ("'2016-02-15'") has a different type than operand ("date")
请注意,Q2 生成的输出文件用作 Q1 的输入。
Q1:不使用 logparser 过滤数据,而是使用 findstr
和 /g:file /v
开关来过滤输入文件或输出行(视情况而定)
Q2:字符串不是时间戳。使用
BETWEEN TO_TIMESTAMP('%date_1%','yyyy-MM-dd') AND TO_TIMESTAMP('%date_2%','yyyy-MM-dd')