Grep для номера в строке

Я решил, что могу просто проверить это, поэтому я запустил:

sudo mount -o remount,size=2800M /run

Работает как шарм:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           2.8G   45M  2.7G   2% /run

Я немного заполнил его:

fallocate -l 1G /run/test.img
fallocate -l 1G /run/test2.img
fallocate -l 500M /run/test3.img

Результат:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           2.8G  2.6G  208M  93% /run

Система все еще работает. Доступность свопа упала, что доказывает, что он использовался:

swap availability drop

  • 17:10: создать 2,5 ГБ файлов в / запустить
  • 17:20: удалить файл размером 500 МБ

Общий объем подкачки уменьшается на взятый объем Автор / run .

Я бы протестировал 10 ГБ на виртуальной машине, потому что я не знаю, откажется ли ядро ​​от перемонтирования или будет просто непредвиденное поведение.

Я все еще ищу реальный ответ, но прагматический подход показал, что он работает.

1
25.11.2018, 02:22
4 ответа

Для первого:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9]' file

Для второго:

grep -oP 'IBM/WebSphere/\K[0-9]\.[0-9].*java ' file
  • -P активирует регулярные выражения Perl
  • -o печатает только совпадающую часть
  • IBM / WebSphere / \ K начало части до \ K , которая очищает совпадающую переменную, так что это не будет частью того, что печатается
  • [0-9] \. [0-9] цифра, за которой следует точка, за которой следует еще одна цифра.
    • . * java во втором, вы также хотите сопоставить до конца команды java (до java , за которым следует пробел).
4
27.01.2020, 23:11
ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\.\)|\1|p'

Похоже, что там выводится ps , но если да, то, вероятно, было ошибкой включать аргументы в команды, которые вы ищете. Это особенно верно, если вы grep проверяете результаты, потому что шаблон поиска для . * Java. * или чего-то еще, скорее всего, будет соответствовать grep команда, которую вы выполняете.

К счастью, вы можете искать только comm = , а также именовать и удалять эти результаты, как я сделал выше, который должен обрабатывать Выход 2 . Для первого:

ps -Aocomm= | sed -ne'/java$/s|.*/\([0-9]\..\).*|\1|p'

Если это не ps , то это также работает:

sed 's|.*/\([0-9]\.[^ ]*\).*|\1|' <in

... для Выход 2 и ...

sed 's|.*/\([0-9]\..\).*|\1|' <in

.. .for Выход 1 ...

3
27.01.2020, 23:11

Использование grep с PCRE ( -P ):

Первый:

$ grep -Po '/\K[[:digit:].]+(?=/)' file.txt 
7.0
8.5

Второй:

$ grep -Po '/\K[[:digit:].]+/[^ ]+' file.txt 
7.0/UpdateInstaller/java/jre/bin/java
8.5/AppServer/java_1.7_64/jre/bin/java
  • Для первого случая, / \ K [ [: digit:].] + (? = /) получит числа в формате / xy / , где x и y оба являются цифрами

  • / \ K [[: digit: ].] + / [^] + будет искать подстроку из / xy / в пробел, который является нашей желаемой частью во втором случае

1
27.01.2020, 23:11

Сначала перечислите все установленные пакеты и их версии на компьютере, где вы пытаетесь создать «клон» из: rpm -qa >/tmp/rpm.list.txt .

Затем скопируйте /tmp/rpm.list.txt в систему, которую вы пытаетесь превратить в «клон» другой системы, и запустите zypper и передайте ему только что созданный список пакетов: zypper install $ (cat/tmp/rpm.list.txt) (или куда бы вы ни поместили файл, содержащий список пакетов из

-121--50452-

Другой способ (аналогично моему ответу в этом вопросе ):

printf 'string' | paste -d'\0' - infile > outfile

или:

printf string | cat - infile > outfile

или:

{ printf string; cat infile; } > outfile
-121--98861-

Так как вы не описали , что вы хотите, но только показанные вход и выход 1 , существует очень много возможных ответов.

Глупые файлы

  1. printf «7 .0\n8.5\n»
  2. printf «7 .0/StartInstaller/java/jre/bin/java\n8.5/AppServer/java _ 1,7 _ 64/jre/bin/java\n»

Они имеют то преимущество, что даже не нужно читать входные данные.

Мое лучшее предположение о том, что вы действительно хотите

  1. Это становится немного хитрым, так как

     grep -o «[0-9]. [0-9]»  вход 
    дает выход
    7.0
    8.5
    1.7
    

    , поскольку он находит каждую цифру . последовательность цифр , и есть два из них на второй строке входа. Но

     grep -o «/[ 0-9]. [0-9 ]/»  вход 
    дает выход
    /7.0/
    /8.5/
    

    (каждая / цифра . цифра / последовательность), который может быть близок к желаемому, а затем

     grep -o «/[ 0-9]\. [0-9 ]/»  input  | grep -o «[0-9]\. [0-9]» 

    дает результат

     7,0
    8.5
    
  2.  grep -o «[0-9]\. [0-9] [^] *»  ввод 

    получает каждую последовательность непустых символов начиная с цифры . цифра . 1,7 не получает строку к себе потому что он включен в строку 8 .5/... .

____________
1 Пожалуйста, всегда включайте пример ввода и вывода в ваших вопросах. Но также описывают, как вы хотите получить от входа к выходу, или вы получите глупые ответы.

2
27.01.2020, 23:11

Теги

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