Вы могли бы сделать это:
awk '
!($1 in a) || NF > 1 {a[$1] = $0}
END {for (url in a) print a[url]}
' dupe.txt
Порядок строк не сохраняется.
Это сохранит порядок, но потребует 2 проходов по файлу:
awk '
NR == FNR {
if (!($1 in a) || NF > 1) {a[$1] = $0}
next
}
$0 == a[$1]
' dupe.txt dupe.txt
Простое решение
#!/bin/sh
if grep -q '\[.*_.*]' /proc/mdstat
then
echo FAIL
else
echo OK
fi
Это просто проверяет, содержит ли какая-либо строка во входных данных [
, за которым следует _
, за которым следует ]
,в этой последовательности, но (, возможно, )с другими перемешанными символами. Будучи простым решением, оно несовершенно; он считает
sda6[0] _sdb6[1]
для соответствия шаблону.
Эта версия:
#!/bin/sh
if grep -q '\[[^]]*_.*]' /proc/mdstat
then
echo FAIL
else
echo OK
fi
требует, чтобы за [
следовал _
без промежуточных ]
символов(с сохранением требования, чтобы за _
в конце концов следовал ]
. Это все равно будет считаться
sda6[0_ sdb6[1]
как имеющий _
между скобками. Насколько я понимаю, интерпретация этого ввода неоднозначна, и мне все равно, поскольку в вопросе не говорится, как обрабатывать искаженные данные.
Использование GNU grep в режиме PCRE...
Предполагая, что вас на самом деле интересует только последняя запись в строке состояния для устройства, т.е. [some_combination_of U and _]
, которая представляет статус включения/выключения каждого устройства рейда, либо U
для включения или _
для отключения -, что подразумевается в вашем вопросе, но прямо не указано.
#!/bin/bash
if grep -Pq '\[[[:alpha:]]*?(_){1,}[[:alpha:]]*?\]' /proc/mdstat
then
echo "FAIL"
else
echo "OK"
fi
Если вам действительно нужны все экземпляры «_» в квадратных скобках:
#!/bin/bash
if grep -Pq '\[[^]](_){1,}.*?\]' /proc/mdstat
then
echo "FAIL"
else
echo "OK"
fi
Вы можете написать (_){1,}
как _{1,}
, если хотите; результат тот же. Мой стиль для такого регулярного выражения - использовать круглые скобки.