Извлечение данных из текстового файла с использованием bash

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

у Нас есть огромный проект, где по Твиттеру я отметил, что, с 700 модульными тестами, у нас только есть 20%-е покрытие кода .

Scott Hanselman ответил с слова мудрости :

действительно ли это - ПРАВИЛЬНЫЕ 20%? Действительно ли это - 20%, который представляет код, который Ваши пользователи поражают больше всего? Вы могли бы добавить еще 50 тестов и только добавить 2%.

Снова, это возвращается к моему Testivus на Покрытии Кода Ответ. Сколько риса необходимо вставить горшок? Это зависит.

4
задан 13.05.2020, 13:15

4 ответа

Самым самым коротким путем я могу найти:

echo `sed 's/[^0-9]//g' your_file` | sed 's/ /,/g'

Результат:

8192,8194,8202,8245,8434,8754,8761,8762,8764,8771

[^0-9] - означает, что все кроме numericals

s/[^0-9]//g - удаляет все кроме Замены numericals

your_file с путем к Вашему файлу

<час>

Для Вас наконец задача, с kill команда. Быть тщательно при использовании этой строки, это уничтожит каждый PID в списке :

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^ 

Перед выполненной предыдущей строкой, можно хотеть выполнить эту строку:

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^ 

Это покажет что-то вроде этого:

kill -9 8192
kill -9 8194
kill -9 8202
kill -9 8245
kill -9 8434
kill -9 8754
kill -9 8761
kill -9 8762
kill -9 8764
kill -9 8771
<час>

Удачи!

`; do echo "kill -9 $pid";done

Это покажет что-то вроде этого:

kill -9 8192
kill -9 8194
kill -9 8202
kill -9 8245
kill -9 8434
kill -9 8754
kill -9 8761
kill -9 8762
kill -9 8764
kill -9 8771
<час>

Удачи!

`; do kill -9 $pid;done

Перед выполненной предыдущей строкой, можно хотеть выполнить эту строку:

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^ 

Это покажет что-то вроде этого:

kill -9 8192
kill -9 8194
kill -9 8202
kill -9 8245
kill -9 8434
kill -9 8754
kill -9 8761
kill -9 8762
kill -9 8764
kill -9 8771
<час>

Удачи!

`; do echo "kill -9 $pid";done

Это покажет что-то вроде этого:

kill -9 8192
kill -9 8194
kill -9 8202
kill -9 8245
kill -9 8434
kill -9 8754
kill -9 8761
kill -9 8762
kill -9 8764
kill -9 8771
<час>

Удачи!

0
ответ дан 13.05.2020, 13:15
  • 1
    Я не могу отправить SIGTERM в базу данных MySQL для завершения ее ждущего процесса – Vladimir Botka 13.05.2020, 13:15
  • 2
    Программы должны быть отправлены сигналы, которые они могут на самом деле обработать, чтобы дать им шанс вымыться. Я don' t знают что-либо о MySQL, но это кажется особенно верным для связанных с базой данных процессов. , Если SIGKILL единственный способ заставить программу выходить, удалите его и найдите альтернативу. – pandaD 13.05.2020, 13:16
  • 3
    Вы - удивительный человек, спасибо за то такое короткое. но на самом деле в файлах соединения иногда я могу получить IP' s также, который также числовой. таким образом, как you' команда ре может разделить их от процесса IP' s?Спасибо – Hearen 13.05.2020, 13:16
  • 4
    @rajagenupula Что относительно SIGINT и SIGHUP? – sherri 13.05.2020, 13:17
  • 5
    Shouldn' t Вы отправить SIGTERM с сначала? – sherri 13.05.2020, 13:17

Вам не нужен сценарий для такой простой вещи. Можно использовать awk:

awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' file.txt | head -n -1 | awk '{print}' ORS=',' | sed 's/,$/\n/'

Некоторые объяснения:

  • awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' file.txt - печатают от file.txt только поля, которые являются числами.
  • head -n -1 - удаляют последнюю строку / последнее число.
  • awk '{print}' ORS=',' - связывают все строки в одной одной строке, каждое число, разделенное ,.
  • sed 's/,$/\n/' - заменяют в последний раз , символом новой строки.

Или, короче:

awk '$2 ~ "^[0-9][0-9]*$" { print $2 }' ORS=',' file.txt | sed 's/,[0-9]*,$/\n/'
0
ответ дан 13.05.2020, 13:16
  • 1
    Мой брат, спасибо за ответ. + 1, Что было бы, если у меня действительно есть IP' s, потому что из-за соображений безопасности я не имею, дал Вам любой IP' s. IP' s являются третьим полем. – steve 13.05.2020, 13:16

где текст находится в input файл в том же каталоге, и результат дан в output файл.

cat ./input | sed -e 's/+------+------+//g' | sed -e 's/| Id   | User |//g' | sed -e 's/ | root |//g' | tr -d "\n" | sed -e 's/| /,/g' | sed -e 's/ ,/,/g' | sed -e 's/ ,/,/g' > output

, Когда я сделал это Ваш пример, я добрался:

+------+------,8192,8194,8202,8245,8434,8754,8761,8762,8764,8771

, Который может, потому что верхняя строка Вашего примера отсутствовала + - может быть несколько других ошибок...

Тогда я думаю, что просто необходимо добавить sudo /mysql_rms/bin/mysqladmin -S /mysql_rms/var/mysql_rms.sock -p kill вначале

<час>

Или, в том, что является, надо надеяться, небольшим улучшением на какой предложенный Radu (также на основе вышеупомянутого входа):

cat ./input | sed 's/[+-]*//g' | sed 's/ | root |//g' | tr -d "\n" | sed 's/| /,/g' | sed 's/ ,/,/g' | sed 's/ ,/,/g' | sed 's/^,//' | sed 's/,[0-9]* $/\n/' | sed 's/Id//g' | sed 's/,User,,//g' | sed 's/ //g' > output

Затем на основе Вас Q& здесь , необходимо быть в состоянии работать:

sudo /mysql_rms/bin/mysqladmin -S /mysql_rms/var/mysql_rms.sock -p kill $(cat ./output)

, хотя можно хотеть проверить, является ли это правильной командой с этим сначала:

echo "sudo /mysql_rms/bin/mysqladmin -S /mysql_rms/var/mysql_rms.sock -p kill $(cat ./output)"
0
ответ дан 13.05.2020, 13:16
  • 1
    И cat не необходимо. Посмотрите man sed; sed может взять в качестве аргумента входной файл (и это нормально, с тех пор sed потоковый редактор). – Meng 13.05.2020, 13:16
  • 2
    @RaduRДѓdeanu - Лучше? - Я провел бы больше времени при изучении этого вида вещи, но мне нужно больше определенного объекта, названного ' time' – Théré Hernandez 13.05.2020, 13:16
  • 3
    Лучше использовать sed -e 's/[+-]*//g' вместо sed -e 's/+------+------+//g'. – Théré Hernandez 13.05.2020, 13:17
  • 4
    @Wilf, Но у Вас есть много времени, и Вы тратите его на askubuntu как я другие:) – zwitterion 13.05.2020, 13:17
  • 5
    как насчет того, чтобы чинить ту маленькую нежелательную вещь? благодарит ответить и усилие:) – Meng 13.05.2020, 13:18

Вот один лайнер для Вашей цели,

sed 's/[^0-9]//g' file.txt| xargs | sed 's/ /,/g'

или

sed 's/[+|IdUserroot\-]*//g' file.txt | xargs | sed 's/ /,/g'

Вывод:

8192,8194,8202,8245,8434,8754,8761,8762,8764,8771

Объяснение

man sed

s/regexp/replacement/
          Attempt  to  match  regexp  against the pattern space.  If successful, replace that
          portion matched with replacement.  The replacement may contain the special  charac‐
          ter  & to refer to that portion of the pattern space which matched, and the special
          escapes \1 through \9 to refer to the corresponding matching sub-expressions in the
          regexp.

g     Copy/append hold space to pattern space.

Регулярное выражение <глоток> [Википедия]

[^ ]    Matches a single character that is not contained within the brackets.
For example, [^abc] matches any character other than "a", "b", or "c". [^0-9]
matches any single character that is not a number from "0" to "9".

Следовательно использование sed я заменил все пространством. Затем xargs помещает их в строку, разделенную пространством,

$ sed 's/[^0-9]//g' file.txt| xargs
8192 8194 8202 8245 8434 8754 8761 8762 8764 8771

Наконец шаг, я заменил все пробелы , использование sed

0
ответ дан 13.05.2020, 13:16
  • 1
    Если я сверяюсь с большим количеством количества полей (у них есть уязвимая информация), не помощь. но с данной информацией Вы правы. Я не говорю, что это неправильно, но я говорю что не очень точный для точного извлечения. Еще раз спасибо за ответ. – Meng 13.05.2020, 13:17
  • 2
    Спасибо за ответ +1, мне нравится иметь некоторое объяснение, потому что в будущем, возможно, помогает кому-то к понятому, что может сделать эта команда.:) – thisiskelvin 13.05.2020, 13:17
  • 3
    @rajagenupula смотрят на редактирование. Сообщите мне, нужно ли этому дальнейшее объяснение:) – Théré Hernandez 13.05.2020, 13:18

Теги

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