Вероятно, вы захотите заключить управляющие коды терминала в \[...\]
, чтобы сообщить Bash, что они на самом деле не печатают символы.В противном случае они будут путать оболочку, когда она попытается подсчитать, насколько широка подсказка.
Так что используйте "\[\e[91m\]xxx\[\e[0m\]"
.
Из руководства:
\[ Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\] End a sequence of non-printing characters.
-v
, который вы передали, заставляет его делать противоположное тому, что вы намереваетесь - он показывает вам для каждой строки в sitelist1.txt
все строки в sitelist2.txt
, которые не совпадают. Готов поспорить, вы видите много дубликатов. Вы хотите использовать ту же команду без параметра -v
:
fgrep -f sitelist1.txt sitelist2.txt
Это приведет к выполнению следующей английской директивы: Для каждой строки в sitelist1.txt
покажите мне все строки в sitelist2.txt
, которые содержат строку файла 1, которая меня интересует, как целую строку или как часть строки файла 2.
Параметр -v
- это параметр «инвертировать совпадение», который показывает все несовпадающие строки.
Если вам нужны полные урлы в каждой строке, а не подстроки, вы можете использовать comm
comm -23 <(sort -u fileA) <(sort -u fileB)
Объяснение:
comm ожидает сортированный вход, поэтому мы сначала сортируем и уникализируем 2 файла (sort -u file)
.
Далее - используем подстановку процесса, чтобы передать вывод sort -u
как "файл" в comm, поскольку comm ожидает файлы: comm <() <()
.
Last - подавить столбцы 2 (строки, уникальные для файла B) и 3 (строки, общие для обоих файлов), чтобы вывести только строки в столбце 1 (строки, уникальные для файла A).
Ответ Джона (помимо недоразумения, указанного в комментариях под вопросом) является ответом на вопрос, однако я хотел бы также отметить, что для простых операций, подобных этой, комбинируйте
(часть of moreutils ) - хороший выбор; его очень легко использовать, так как он позволяет выражать выполняемую операцию с помощью логических операторов (поддерживаются AND, OR, NOT и XOR):
combine sitelist1.txt NOT sitelist2.txt
% cat sitelist1.txt
http://www.facebook.com
http://www.twitter.com
http://myspace.com/profile
http://orkut.com/archived
% cat sitelist2.txt
http://www.facebook.com
http://www.twitter.com
http://myspace.com/profile
% combine sitelist1.txt NOT sitelist2.txt
http://orkut.com/archived
В отличие от большинства утилит, входные файлы не нуждаются в быть отсортированными (хотя я предполагаю, что они все еще сортируются внутри), однако, как и при использовании fgrep
, существует ловушка в случае повторяющихся строк в sitelist1.txt
, которые не используются ' не хочу, чтобы их печатали. Если sitelist1.txt
содержит повторяющиеся строки, и вы не хотите их печатать, вам придется направить вывод объединить
в sort -u
:
combine sitelist1.txt NOT sitelist2.txt | sort -u