このスクリプトの出力ラインを一意に印刷し、各行の繰り返し回数を印刷する方法[閉じる]

このスクリプトの出力ラインを一意に印刷し、各行の繰り返し回数を印刷する方法[閉じる]
#!/bin/bash

who |grep "10\.1\.109" | grep -v berianho | cut -f1 -d " " | sort -n|

while read user 
do 
    grep -a ^$user: /etc/passwd | cut -f5 -d:
done

答え1

単純なPerlスクリプト...

#!/usr/bin/perl

my %hash;

open FH, 'who |' or die;
while ( <FH> ) {
   $hash{$1}++ if /^(\S+).*(10\.\d+\.\d+\.\d+)/;
}
close FH;

while ( ($k,$v) = each %hash ) {
   printf "%3d %s\n", $v, $k;
}

exit;

答え2

これがあなたが望むものについての私の仮定です。

#!/bin/bash
list="$(who |grep "10\.1\.109" | grep -v berianho | cut -f1 -d " ")"
unique="$(echo ${list} | tr ' ' '\n' | sort | uniq)"

for student in $unique
do
  echo "Student $(grep -a ^${student}: /etc/passwd | cut -f5 -d ":" ) has number of $(echo "$list" | tr ' ' '\n' | grep ${student} | wc -l) logins."
done

出力例では、AAAの3項目(passwdの場合はAAA AAAと呼ばれます)、BBBの場合は1つの項目(passwdの場合はBBB BBBと呼ばれます)、CCの場合は1つの項目(passwdの場合はCCC CCCと呼ばれます)があるとしますwho。出力は次のようになります。

Student AAA AAA has number of 3 logins.
Student BBB BBB has number of 2 logins.
Student CCC CCC has number of 1 logins.

関連情報