Почему я не могу получить уникальный список оболочек?

Следующий сценарий достигает того, что вы хотите:

i=0
for file in *exam*
do
  if [ -d "$file" ] || [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]
  then
    i=$((i+1))
  fi
done
echo "Number of files: $i"

Он перебирает все файлы, имя которых содержит exam, и для каждого такого файла проверяет, является ли он каталогом или содержит строку exam, и если да, то скрипт увеличивает счетчик на единицу.

Редактировать:Вероятно, я неправильно понял ваш вопрос, и вы хотите считать каталоги и файлы отдельно. В этом случае измените сценарий на

i=0;j=0
for file in *exam*
do
  if [ -d "$file" ]; then
    i=$((i+1))
  elif [ -n "$(sed -n '/exam/{p;q}' -- "$file")" ]; then
    j=$((j+1))
  fi
done
echo "Number of directories: $i"
echo "Number of regular files: $j"
3
28.01.2021, 15:34
2 ответа

Это потому, что как uniqработает, от человека:

Note: 'uniq' does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use 'sort -u' without 'uniq'.

Итак, лучше использовать, не нужноcat:

$ cut -d ':' -f 7 /etc/passwd | sort -u
/bin/bash
/bin/false
/bin/sync
/usr/sbin/nologin

Или одна команда

 awk -F: '{ print $7 | "sort -u" }' /etc/passwd

Предложение @kojiro :

awk -F: '!s[$7]++{print $7}' /etc/passwd
8
18.03.2021, 22:34

Вы должны передать отсортированный вывод в uniq, чтобы заставить его работать.

$ cat /etc/passwd | cut -d ':' -f 7 | sort | uniq
/bin/bash
/bin/sync
/sbin/halt
/sbin/shutdown
7
18.03.2021, 22:34

Теги

Похожие вопросы