Подсчитать количество совпадений и удалить строку совпадений.

Вам, вероятно, лучше определить, каким пакетам соответствуют эти разделяемые библиотеки, и использовать этот список пакетов для установки через yum на второй машине. Таким образом вы будете получать обновления, когда их найдет yum.

Навскидку, вы можете не делать это, если:

  • вторая машина не имеет доступа к сети или
  • в целях тестирования вы хотите продублировать конфигурацию для небольшого выхода -of-date machine (где yum больше не имеет этих конкретных версий пакетов).

Сбор информации о пакете осуществляется с помощью rpm -qf для каждого файла, например,

rpm -qf /usr/lib64/libfreebl3.so

, который предоставит вам пакет и его версию - достаточно информации для установки того же пакета с помощью yum на другой машине. .

Если вы настраиваете разделяемые библиотеки, вы также должны знать, что они могут зависеть от файлов конфигурации (включая те, которые будут установлены в /etc/ld.so.conf.d ). Вы можете найти файлы, которые являются частью того же пакета , используя rpm -ql , например,

rpm -ql $(rpm -qf /usr/lib64/libfreebl3.so)

Конечно, у вас будут дубликаты. Кроме того, эти библиотеки могут зависеть от других пакетов (со своими собственными файлами конфигурации), которые не очевидны. В этом случае rpm -qR помогает , но необходимо немного поработать, чтобы убедиться, что у вас есть нужные файлы).

Работа со списком библиотек:

ldd Xvfb | grep '/usr/lib64/'

вы можете составить список пакетов с помощью

ldd Xvfb | grep '/usr/lib64/' | xargs rpm -qf

и получить соответствующий список файлов

ldd Xvfb | grep '/usr/lib64/' | xargs -n 1 rpm -qf | xargs -n 1 rpm -ql

и tar , которые вверху:

tar czf /tmp/blob.tar.gz $(ldd Xvfb | grep '/usr/lib64/' | xargs -n 1 rpm -qf | xargs -n 1 rpm -ql)

хотя вы можете добавить этап с помощью sort -u , чтобы отфильтровать повторяющиеся пакеты. rpm будет принимать несколько пакетов в одних строках, но не в других, поэтому я использовал параметр -n 1 на всякий случай (r).

Если, как предлагалось, вам просто нужны файлы библиотеки, это можно сделать следующим образом:

#!/bin/sh
mkdir  /tmp/xvfb
cd /usr/lib64
tar czf /tmp/xvfb/Xvfb.tar.gz $(ldd /usr/bin/Xvfb | grep '/usr/lib64/' | cut -d '=' -f1 | awk '{print $1}' | while read IN; do OUT=`readlink $IN`; cp -rf $OUT /tmp/xvfb/$IN; echo /tmp/xvfb/$IN; done)

в то время как подход, который я предложил с использованием rpm -q , предоставит символические ссылки для файлов. (Быстрая проверка с помощью CentOS6: здесь нет файлов ldconfig, но есть много файлов / usr / share , которые вы бы отфильтровали).

1
02.05.2017, 00:46
4 ответа

с awk

awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile
1
27.01.2020, 23:16

Perl спешит на помощь!

perl -aF, -ne 'print unless 5 == grep /^0$/, @F;' < input > output
  • -n читает строку за строкой
  • -a разбивает каждую строку на массив @F
  • -F указывает, как разделить (в данном случае запятой)
  • grep , используемый в скалярном контексте, возвращает количество совпадений.
3
27.01.2020, 23:16

При условии, что ни одно число, кроме 0, не начинается с 0 в вашем файле и что первое поле не является числом, как в вашем примере, вы могли бы сделать:

sed -ne 's/,0//5;t' -e p < input > output

Обратите внимание, что это удаляет те строки, которые имеют по крайней мере 5 нулей.

При использовании вашего примера можно сделать:

grep ',.*[1-9].*,.*[1-9]'

(поиск двух ненулевых полей после первого).

1
27.01.2020, 23:16
awk 'gsub(/,0/, ",0", $0) != 5' data.input
0
27.01.2020, 23:16

Теги

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