Unix ksh - 打印PID编号并重复计数

时间:2018-03-24 07:26:40

标签: shell sorting unix grep ksh

日志文件abc.log

PID:6543 ……    
…………………
PID:4325 ……
……………………
PID:6543 ……    

日志文件xyz.log

PID:8888 ……
…………………
PID:9992 ……
……………………
PID:6543 ……

注意:PID编号可以在文件中重复。并且一个PID号码可以出现在多个日志文件中。

今天在一次采访中询问了这个问题,我必须返回每个PID编号和今天记录的每个PID编号的输出。 这是我写的脚本。你能否确认一下是否有效。面试官没有说我的答案是否正确。有人可以帮我查一下。他们希望我打印每个唯一的PID:数字及其计数,标签空间如PID:5674 10

- 如果今天和前一天的日志文件在同一个文件夹中

#!/bin/ksh

cd /A/B/ 
for a in `ls -lrt | grep "Mar 24" | awk '{print $9}'`;    — list of files generated today
do 
grep "^PID:" $a | cut -d " " f1  >> /tmp/abc.log   — saving first column which look like PID:23456 
done

for b in `cat /tmp/abc.log | sort -u`;
do
x=grep $b /tmp/abc.log | grep -v grep | wc;
echo $b"    "$x    — will print like PID:23456  56(count)
done

#!/bin/ksh

— If today’s log files are in different folder
cd /A/B/
for a in `ls /A/B/*.log`
do
grep "^PID:" $a | cut -d " " f1 >> /tmp/abc.log
done

for b in `cat /tmp/abc.log | sort -u`;
do
x=grep $b /tmp/abc.log | grep -v grep | wc;
echo $b"    "$x
done 

1 个答案:

答案 0 :(得分:0)

您可以使用awk

grep -h 'PID:' *.log > all_pids.log  
#put only PID lines to a file.This can also be done 
#with pattern in awk and multiple files. I'm just separating it for clarity

awk  '
  { a[$1]++ }     #increments by 1 for corresponding PID
  END {
    for (i in a) {
      printf "%s %s\n", i, a[i];   
    }
  }
'  all_pids.log