grep выборочно

Prueba esto:

pid=$(fuser 3000/tcp 2>/dev/null)

(requiere psmiscpaquete)

Tenga en cuenta que esto es confiable solo cuando lo ejecuta el usuario root. Otros usuarios solo pueden esperar encontrar procesos ejecutándose con el mismo usuario.


Explicación aburrida para el acceso solo a la raíz con un ejemplo aquí.
Cualquiera que sea el método utilizado (fuser, ss, lsof,... ), todos terminan haciendo coincidir la lista disponible de descriptores de procesos con una lista disponible de conexiones de red (, por ejemplo, para tcp está disponible en/proc/net/tcp).
Por ejemplo,intentar obtener el pid usando el puerto22/tcp(con 22 = 0x0016 )terminaría haciendo este tipo de comparación:

Entrada desde/proc/net/tcp:
0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 141408 1 000000000a9ac1b5 100 0 0 10 0

con:
dr-x------. 2 root root 0 May 14 17:59 /proc/358/fd lrwx------. 1 root root 64 May 14 17:59 /proc/358/fd/3 -> socket:[141408]

Como este descriptor fd solo está disponible para su usuario (que resulta ser root en este ejemplo )o root, solo ese usuario o root puede descubrir que el pid es 358.

0
30.05.2019, 21:59
3 ответа
grep -xF -f desfile listfile

Или, если desfileявляется командой,

grep -xF -f <(desfile) listfile

или,

desfile | grep -xF -f /dev/stdin listfile

Здесь используются следующие параметры:

  • -x, требуется совпадение по всей длине строки. Это то, что вы хотите использовать, чтобы не сопоставлять подстроки в строках.
  • -F, использует сравнение строк, а не сопоставление регулярных выражений. Это ускорит выполнение запроса и будет необходимо, если ваши шаблоны содержат специальные символы в регулярных выражениях (, но вы не хотите, чтобы они были специальными ).
  • -f filename, читать шаблоны из файла, а не из строк в командной строке. Это будет работать для умеренного количества шаблонов. Если у вас много много шаблонов, у вас может не хватить памяти, и в этом случае вы можете разделитьdesfile(или вывод desfile, если это команда ), на несколько файлов меньшего размера, используя split, а затем перебрать их. В любом случае, вы не захотите вызывать grepодин раз для каждого шаблона!
3
28.01.2020, 02:22

Если вы проверяете, является ли ваш указатель началом каждой строки, вы можете

grep ^$desig listfile

Если вы хотите ограничиться первым попаданием, добавьте переключатель -m 1.
Если вам нужен более детальный поиск, попробуйте регулярное выражение:

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

оба соответствуют точно 2, в зависимости от вашего варианта использования. И чтобы grep не распознал, например.2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

цвета в моем баше только одинокие 2.

0
28.01.2020, 02:22

Поскольку производительность вызывает беспокойство, рассмотрите возможность использования ripgrep, которая в ряде случаев обеспечивает более быстрое тестирование, чем grep.

0
24.02.2020, 22:23

Теги

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