Невозможно использовать uniq - c для печати счетчиков для всех строк - PullRequest
1 голос
/ 13 января 2020

Я хотел бы использовать uniq для подсчета количества вхождений каждой строки, исключая числовое значение в начале строки (пример: 0000: 01: 00.0)

Каждое вхождение встречается более одного раза , Могут быть ситуации, когда каждое вхождение происходит только один раз.

Пример ввода

[root@cpod-compute-1 ~]# for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do lspci -Dm | grep $i; done
0000:01:00.0 "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Connection" -r01 "Cisco Systems Inc" "Device 00d5"
0000:01:00.1 "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Connection" -r01 "Cisco Systems Inc" "Device 00d5"
0000:0a:00.1 "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"
0000:0a:00.2 "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"
0000:0a:00.3 "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"

Ожидаемый результат

2  "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Connection" -r01 "Cisco Systems Inc" "Device 00d5"
3  "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"

Пример нерабочего случая

[root@cpod-compute-1 ~]#  for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do lspci -Dm | grep $i | awk '{$1="";print $0}' | sort | uniq -c; done
      1  "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Connection" -r01 "Cisco Systems Inc" "Device 00d5"
      1  "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Connection" -r01 "Cisco Systems Inc" "Device 00d5" 
      1  "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"
      1  "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"
      1  "Ethernet controller" "Intel Corporation" "Ethernet Controller X710 for 10GbE SFP+" -r01 "Cisco Systems Inc" "Ethernet Converged NIC X710-DA"

Собранные выходы - Я не вижу неожиданных символов в собранных выходах.

[root@cpod-compute-1 ~]#  for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do lspci -Dm | grep $i | awk '{$1="";print $0}' | od -c; done
0000000       "   E   t   h   e   r   n   e   t       c   o   n   t   r
0000020   o   l   l   e   r   "       "   I   n   t   e   l       C   o
0000040   r   p   o   r   a   t   i   o   n   "       "   I   3   5   0
0000060       G   i   g   a   b   i   t       N   e   t   w   o   r   k
0000100       C   o   n   n   e   c   t   i   o   n   "       -   r   0
0000120   1       "   C   i   s   c   o       S   y   s   t   e   m   s
0000140       I   n   c   "       "   D   e   v   i   c   e       0   0
0000160   d   5   "  \n
0000164
0000000       "   E   t   h   e   r   n   e   t       c   o   n   t   r
0000020   o   l   l   e   r   "       "   I   n   t   e   l       C   o
0000040   r   p   o   r   a   t   i   o   n   "       "   I   3   5   0
0000060       G   i   g   a   b   i   t       N   e   t   w   o   r   k
0000100       C   o   n   n   e   c   t   i   o   n   "       -   r   0
0000120   1       "   C   i   s   c   o       S   y   s   t   e   m   s
0000140       I   n   c   "       "   D   e   v   i   c   e       0   0
0000160   d   5   "  \n
0000164

[root@cpod-compute-1 ~]# for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do lspci -Dm | grep $i | awk '{$1="";print $0}' | sed -n l; done
 "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Conn\
ection" -r01 "Cisco Systems Inc" "Device 00d5"$
 "Ethernet controller" "Intel Corporation" "I350 Gigabit Network Conn\
ection" -r01 "Cisco Systems Inc" "Device 00d5"$

Я не могу понять, в чем разница между соседними строками, которые выглядят дублированными.

Пожалуйста, дайте мне знать, если требуются какие-либо дополнительные выводы.

Спасибо.

1 Ответ

2 голосов
/ 13 января 2020

Код, который использовал ОП:

for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do 
   lspci -Dm | grep $i | awk '{$1="";print $0}' | sort | uniq -c;
done

Хотя он должен был прочитать:

for i in $(awk -F= '/PCI_SLOT_NAME/{print $2}' /sys/class/net/*/device/uevent); do 
   lspci -Dm | grep $i | awk '{$1="";print $0}'
done | sort | uniq -c;

Разница между этими двумя случаями заключается в том, что в первом случае вы сортируете вывод одной команды :

lspci -Dm | grep $i | awk '{$1="";print $0}'

Во втором случае вы сортируете выходные данные полного for-l oop.

Обновленная версия будет быть следующим:

awk -F= '(FNR==1){ OFS=FS=(f==0 ? "=" : " "); $0=$0 }
         (f==0) && /PCI_SLOT_NAME/{a[$2];next}
         ($1 in a) {$1=""; $0=$0; $1=$1; print}
        ' /sys/class/net/*/device/uevent f=1 <(lspci -Dm) | sort | uniq -c

Теперь мы можем объединить счет в awk:

awk -F= '(FNR==1){ OFS=FS=(f==0 ? "=" : " "); $0=$0 }
         (f==0) && /PCI_SLOT_NAME/{a[$2];next}
         ($1 in a) {$1=""; $0=$0; $1=$1; b[$0]++}
         END{for (i in b) print b[i],i}
        ' /sys/class/net/*/device/uevent f=1 <(lspci -Dm)
...