如何将一条线分成四条线

时间:2011-06-02 19:43:52

标签: shell command-line

我有一个大型日志文件。在这个日志文件中,我有一些像这样的行

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,但还没有真正使用它。

只是寻找合适的工具来解决这个问题。

6 个答案:

答案 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

BASH FAQ entry #1

答案 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