【问题标题】:Unix ksh - To print the PID number and repeat countUnix ksh - 打印 PID 编号和重复计数
【发布时间】:2018-03-24 07:26:39
【问题描述】:

日志文件 abc.log

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

日志文件 xyz.log

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

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

这个问题在今天的一次采访中被问到,我必须返回带有每个 PID 号的输出以及今天记录的每个 PID 号的计数。 这是我写的脚本。你能确认这是否可行。面试官没有说我的答案是否正确。有人可以为我审查这个。他们希望我用 PID:5674 10 之类的制表符空间打印每个唯一的 PID:number 及其计数

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

#!/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 

【问题讨论】:

  • 请将该示例输入的所需输出添加到您的问题中。
  • 他们希望我打印每个唯一的 PID:number 及其计数,例如 .. PID:5674 10
  • 你的脚本中有大量的 UTF-8 大引号应该是 ASCII 双引号 "。事实上,任何人都无法轻松测试这些脚本。
  • 现已更正。看起来他们在从文本文件粘贴到网页时转换为 UTF-8。
  • 您可以尝试类似grep -Eo "PID:[0-9]*" | sort | uniq -c 并使用sed 将格式更改为所需的格式。应避免在循环内(对于每一行)使用grep

标签: shell sorting unix grep ksh


【解决方案1】:

你可以使用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

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2014-06-28
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多