поиск файлов с несколькими строками (включая все, не одна или другая) и номерами строк печати

Perl решение:

perl -aF'[,-]' -ne 'print join ",", @F[0..2], join("/", @F[5,4,3]), $F[6]' < input
1
04.06.2015, 10:57
2 ответа

Я бы положил

* * * * * /sbin/reboot

в корневой кронтаб.

Пояснение: поскольку cron не запускается до тех пор, пока система не будет полностью запущена, вы не получите конфликтов между процедурами запуска и завершения работы.

-121--78960-

Таблица маршрутизации точно не игнорируется. Она отменяется таблицей маршрутизации с более высоким приоритетом.

Что происходит

Таблица маршрутизации, отображаемая при вводе ip route show , не является единственной таблицей маршрутизации, используемой ядром. По умолчанию существует три таблицы маршрутизации, поиск в которых выполняется в порядке, указанном командой ip rule :

# ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Наиболее знакомая вам таблица является основной , а таблица маршрутизации с наивысшим приоритетом - локальной . Эта таблица управляется ядром для поддержания трека локальных и широковещательных маршрутов: другими словами, локальная таблица сообщает ядру о том, как выполнять маршрутизацию по адресам собственных интерфейсов. Выглядит примерно так:

# ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
broadcast 192.168.1.0 dev eth0  proto kernel  scope link  src 192.168.1.2
local 192.168.1.1 dev tun0  proto kernel  scope host  src 192.168.1.1
local 192.168.1.2 dev eth0  proto kernel  scope host  src 192.168.1.2
broadcast 192.168.1.255 dev eth0  proto kernel  scope link  src 192.168.1.2

Проверьте, что строка ссылается на tun0 . Вот что вызывает ваши странные результаты от маршрут получить . Он говорит, что 192.168.1.1 является локальным адресом, что означает, что если мы хотим отправить ARP ответ на 192.168.1.1, это легко; мы отправляем его себе. Так как мы нашли маршрут в локальной таблице, мы прекращаем поиск маршрута и не пытаемся проверить основные или таблицы по умолчанию .

Почему несколько таблиц?

Как минимум, приятно иметь возможность набрать ip route и не видеть все «очевидные» маршруты, загромождающие дисплей (попробуйте ввести route print на компьютере с ОС Windows). Он также может служить некоторой минимальной защитой от неправильной конфигурации: даже если основная таблица маршрутизации перепуталась, ядро все равно умеет разговаривать с самим собой.

(Зачем в первую очередь сохранять местные маршруты? Таким образом, ядро может использовать тот же код поиска для локальных адресов, что и для всего остального. Это делает вещи проще внутри.)

Есть и другие интересные вещи, которые вы можете сделать с этой схемы с несколькими таблицами. В частности, можно добавить собственные таблицы и указать правила поиска. Это называется «политикой маршрутизацией», и если вы когда-либо хотели маршрутизировать пакет на основе его адреса источника , это как сделать в Linux.

При выполнении особо сложных или экспериментальных операций можно самостоятельно добавить или удалить локальные маршруты, указав таблицу local в команде ip route . Если вы не знаете, что делаете, вы, скорее всего, запутаете ядро. И конечно, ядро все равно продолжит добавлять и удалять свои собственные маршруты, поэтому нужно смотреть, чтобы ваше не перезаписали.

Наконец, если требуется просмотреть все таблицы маршрутизации одновременно:

# ip route show table all

Для получения дополнительной информации см. справочную страницу ip-rule (8) или документы iproute2 .Вы также можете попробовать Advanced Routing and Traffic Control HOWTO для некоторых примеров того, что вы можете сделать.

-121--43936-

С помощью GNU awk вы можете сделать:

awk 'BEGINFILE { n1=n2=0 }
     /str1/ { n1=FNR }
     /str2/ { n2=FNR }
     ENDFILE { if (n1&&n2) print FILENAME,n1,n2 }
' files...

Вариант для списка последовательностей для рассмотрения:

awk -v s="str1 str2 str3" '
  BEGIN { n=split(s,str) ; m=(2^n)-1 }
  BEGINFILE { f=0 }
  { for (i=1; i<=n; i++)
    if ($0 ~ str[i]) {
      l[i] = FNR
      f += 2^(i-1)
    }
  }
  ENDFILE {
    if (f==m)
      for (i=1; i<=n; i++) print FILENAME,l[i]
  }
' files...

Команды лучше поместить в файл сценария для выполнения, и заменить файлы ... перечислите «$ @» для передачи файлов в скрипт в качестве аргументов.

Сценарий, скажем «findall», для передачи каталога (как предложено в комментарии) и последовательностей может быть:

dir=${1:?}
shift
cd "$dir" || exit 1

awk -v s="$*" '
  ...as above...
' *

и coukd называться findall dir str1 str2... strN . (Обратите внимание, что последовательности поиска не могут содержать пробелы.)

1
27.01.2020, 23:50

Один из методов состоит в том, чтобы сначала перечислить совпадающие файлы, а затем снова прочитать файлы, чтобы найти нужные строки. Это эффективно, если совпадающие файлы не слишком велики и не слишком многочисленны.

Предполагается, что достаточно недавних утилит GNU (Linux / Cygwin), чтобы избежать проблем с именами файлов, содержащими специальные символы:

grep -Rlz -Fe "foo" . |
xargs -0 grep -lz -Fe "bar" /dev/null |
xargs -0 grep -lz -Fe "qux" /dev/null |
xargs -0 awk '/foo|bar|qux/ {print FNR}' /dev/null
0
27.01.2020, 23:50

Теги

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