我有一个大型日志文件。在这个日志文件中,我有一些像这样的行
AgentID:5000|Glass Manufacturing|Seattle|36
AgentID:5000|Shoe Manufacturing|Las Vegas|31
如果我grep for AgentID:5000,那么我将获得与Agent 5000相关的所有记录。但是我需要像这样拆分报告。
AgentID: 5000
Company Name: Glass Manufacturing
HeadQuarter: Seattle
Number of employees: 36
Company Name: Shoe Manufacturing
HeadQuarter: Las Vegas
Number of employees: 31
这是一个linux服务器,日志文件是这样我可以使用所有的Linux技巧。如果需要,我可以使用perl或ruby脚本。
什么是入门的最佳方式。我之前从未做过文本解析。我听说过awk和sed,但还没有真正使用它。
只是寻找合适的工具来解决这个问题。
答案 0 :(得分:0)
$ IFS='|' read id company hq empcount <<< 'AgentID:5000|Glass Manufacturing|Seattle|36'
$ echo "$id, $company, $hq, $empcount"
AgentID:5000, Glass Manufacturing, Seattle, 36
答案 1 :(得分:0)
你列出的所有工具都是“正确的”但我可能会选择带有Text :: CSV cpan模块的perl选项:
http://search.cpan.org/perldoc?Text%3A%3ACSV%3A%3ASeparator
正如您在文档中看到的那样,管道(|)是可用于检测的内置分隔符之一。
这是另一个指向简单perl脚本的链接,其中包含一些使用该模块进行文本解析:
http://www.joelbdalley.com/page.pl?29
毫无疑问,很容易找到很多其他例子。
答案 2 :(得分:0)
为此我会使用emacs宏。请参阅:
中的“宏”http://swiss-knife.blogspot.com/2007/11/emacs-survival-kit.html
答案 3 :(得分:0)
awk,sed和shell都可以解决这个问题,这是对原始Unix实现者的集体天才的一个了不起的证明,那些1970年代的工具今天仍然非常有价值。
但是,如果这是我的问题,我会像你提到的那样直接去Perl或Ruby。
这是一个Ruby实现。 ($ ruby whatever.rb < file
)
E = [:'Company name', :'Headquarters', :'Number of employees']
T = Struct.new *E
while s = gets
id, idn = fields = s.split(/[:|]/)
puts "\nAgentID: " + idn unless idn == @idn
puts
@idn = idn
line = T.new *fields[2..-1]
puts E.map { |a| "#{a}: #{line[a]}" }
end
答案 4 :(得分:0)
这是你的脚本,(未经测试)
case "$#" in
0|1) echo "Usage: $0 filename agent_id[s]"; exit 1;;
*) file=$1; shift;;
esac
for wanted in "$@"
do
echo "AgentID: $wanted"
echo #empty line
< "$file" grep "^AgentID *: *$wanted|" |(IFS=\|; while read id name hq num
do
echo "Company Name: $name"
echo "HeadQuarter: $hq"
echo "Number of employees: $num"
echo #empty line
done)
done
答案 5 :(得分:0)
还没有人给你awk
答案,所以为了完整起见,这是:
awk -F'|' '
BEGIN {
print "AgentID: 5000\n";
}
/^AgentID:5000|/ {
print "Company name: ", $2, "\nHeadquarters: ", $3, "\nNumber of employees:", $4, "\n";
}
' datafile