bash и функция для обнаружения дублирующихся данных


0

В этом примере я упоминаю, что у меня есть 2 списка.

list1
x;00:26:82:50:00:00;192.168.1.195;COMPUTER1
x;00:26:82:50:11:11;192.168.1.195;COMPUTER2
x;00:26:82:50:22:22;192.168.1.196;COMPUTER3

list2
x;00:26:82:50:11:11;192.168.1.197;COMPUTER3

И когда я выполняю команду (спасибо ccs242 ):

for field in 2 3 4; do cut -d\; -f${field} list* | sort | uniq -d; done

Я получаю дубликаты

00:26:82:50:11:11
192.168.1.195
COMPUTER3

Теперь я хочу автоматизировать этот процесс с помощью скрипта bash, поэтому, если он не находит дубликаты, выполните определенную команду, но если скрипт обнаружит дубликаты, прервет и оставит дубликаты в / var / log / syslog

Это мой сценарий:

 pathlist=/etc/doc

 function duplicate(){
     acls=`for field in 2 3 4; do cut -d\; -f${field} $pathlist/list* | sort | uniq -d; done`
     if [ ${acls} == '' ]; then
     echo OK
     #run a command foo
 else
     echo "Duplicate Data. Abort. Check /var/log/syslog"
     echo $acls >> /var/log/syslog
     exit
  fi
 }
 duplicate

Проблема здесь:

  [ ${acls} == '' ]

Как я могу это исправить?

Ответы:


1

Если имеется более одного дубликата, то $aclsдля каждой новой строки будет содержаться пробел, и команда будет синтаксически неверной. Что вам нужно это: -

[ "${acls}" == "" ]

Это заставляет сравнение быть между двумя строками. Как и в вашем вопросе, вы можете использовать ''вместо "", но я предпочитаю использовать одинаковые кавычки с обеих сторон сравнения.


0

Попробуйте это так:

if [ -z ${acls} ]

Строка 5: [: слишком много аргументов
ajcg

Пожалуйста, отредактируйте свой ответ, чтобы объяснить немного больше о том, как эта команда работает и что она должна делать.
Twisty Impersonator
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.