Соединение sed с grep не работает должным образом

Причина, по которой вы не можете увеличить / dev / sda2, заключается в том, что ваш раздел подкачки в / dev / sda3 слишком близок к / dev / sda2, чтобы разрешить любые рост. Обратите внимание, что ваш раздел / dev / sda2 начинается с сектора 226453503, а ваш раздел подкачки начинается с самого следующего сектора 226453504. Таким образом, вы фактически просите увеличить раздел над следующим (очень плохая идея, поэтому это запрещено)

Чтобы решить эту проблему, вы можете переместить своп в хвостовую часть диска (на ум приходит gparted) или удалить его и добавить обратно после увеличения / dev / sda2 (с любыми инструментами разбиения, которые вам удобнее всего ). К сожалению, у меня нет предложений по автоматизации процесса, поскольку он зависит от ситуации. Однако, по крайней мере, теперь вы знаете основную причину своей проблемы.

Здесь есть очень похожая проблема и решение: https://www.gnu.org/software/parted/manual/html_chapter/parted_2.html#SEC30

2
05.02.2017, 21:51
4 ответа

Ответ с grep -f, вероятно, лучший, но есть и немного стильная альтернатива:

% cut -d, -f3 file2 >names2
% cat file1 file1 names2 | sort | uniq -u
bill.smith
tim.jones
%

Это, конечно, требует дополнительного временного файла (или забав и игр с дескрипторами файлов), и я бы не хотел пробовать это с большими файлами.

Я упоминаю об этом только потому, что для задач, включающих поиск соответствия между файлами, sort плюс uniq - неожиданно универсальная и, возможно, недооцененная пара инструментов. Для быстрых задач они могут обеспечить не требующий особых размышлений путь к результату.

1
27.01.2020, 21:48

Это должно сработать:

$ pattern=$(cut -d, -f 3 file2)
$ grep -v -e "$pattern" file1  

В вашем примере grep пропускает свой шаблон. Более того, grep может читать либо файл, либо stdin (по каналу), но не оба. Если имя файла не указано, grep читает из stdin.

Также это может сработать:

$ grep -v -f <(cut -d, -f3 file1) file2  

Извините, это не проверено.

3
27.01.2020, 21:48

Это практически последний шаг в моем ответе на ваш предыдущий вопрос.

Ваше решение работает, если добавить -f перед file1 в grep:

$ cut -d, -f3 file2 | grep -v -f file1
tim.jones
bill.smith

С -f, grep будет искать шаблоны в file1. Без него он будет просто использовать file1 в качестве буквального шаблона.

Возможно, вы также захотите использовать -F, поскольку иначе точка в шаблоне будет интерпретироваться как "любой символ". И раз уж вы взялись за это, добавьте -x, чтобы grep выполнял проверку по всей строке (будет полезно, если у вас есть joe.smith, который не должен соответствовать joe. smiths):

$ cut -d, -f3 file2 | grep -v -F -x -f file1

Это требует, очевидно, отсутствия пробелов в конце строк в file1 (которые, похоже, есть в тексте вопроса).

Обратите внимание, что sed не нужен, поскольку вывод cut не содержит никаких ". Кроме того, если бы вам нужно было удалить все ", то tr -d '"' был бы лучшим инструментом.

11
27.01.2020, 21:48

Попробуйте это. Нет sed. Требуется GNU diff и bash.

diff --new-line-format="" --unchanged-line-format="" <(cut -f3 -d, file2|sort) <(sort file1)

Yields results:

bill.smith
tim.jones
5
27.01.2020, 21:48

Теги

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