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

Я предпочитаю использовать id3v2, просто введите id3v2 -l somefile.mp3. Вы также можете увидеть справочную страницу id3v2 для более конкретного использования.

1
задан 24 February 2014 в 22:58

4 ответа

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

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

Результат:

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

[^0-9] - означает все, кроме цифровых

[ f7] - удаляет все, кроме цифр

Замените your_file на путь к вашему файлу

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

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^$'`; do kill -9 $pid;done

Перед запуском предыдущей строки вы можете запустить эту строку:

for pid in `sed 's/[^0-9]//g' your_file | grep -v '^$'`; 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

Удачи!

4
ответ дан 24 May 2018 в 11:25

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

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

4
ответ дан 24 May 2018 в 11:25
  • 1
    Спасибо, что ответили +1, мне нравится иметь какое-то объяснение, потому что в будущем это может помочь кому-то понять, что может сделать эта команда. :) – Ten-Coin 25 February 2014 в 00:11
  • 2
    @rajagenupula взгляните на редактирование. Plz сообщите мне, если это потребует дальнейшего объяснения :) – souravc 25 February 2014 в 00:35
  • 3
    Если я проверяю с большим количеством полей (у них есть конфиденциальная информация), это не помогает. но с предоставленной информацией вы правы. Я не говорю, что это неправильно, но я говорю, что это не так точно для точного извлечения. Еще раз спасибо за ответ. – Ten-Coin 25 February 2014 в 15:21

, где текст находится в файле 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

Когда я сделал это, ваш пример получил: [!d1 ]

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

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

Тогда я думаю, вам просто нужно добавить в начале

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

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 & amp; A, вы должны иметь возможность запускать:

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)"
1
ответ дан 24 May 2018 в 11:25
  • 1
    Лучше использовать sed -e 's/[+-]*//g' вместо sed -e 's/+------+------+//g'. – Radu Rădeanu 24 February 2014 в 23:07
  • 2
    как насчет исправления этой маленькой нежелательной вещи? спасибо за ответ и усилие :) – Ten-Coin 25 February 2014 в 00:13
  • 3
    @ RaduRădeanu - Лучше? - Я потратил больше времени на изучение такого рода вещей, но мне нужно больше определенного объекта под названием «время», – Wilf 25 February 2014 в 01:03
  • 4
    И cat не требуется. Посмотрите на man sed; sed может принимать в качестве аргумента входной файл (и это нормально, поскольку sed является редактором потока). – Radu Rădeanu 25 February 2014 в 01:03
  • 5
    @Wilf Но у вас много времени, и вы тратите его на askubuntu, как и я других :) – Radu Rădeanu 25 February 2014 в 01:07

Я думаю, что это то, что вам нужно. Некоторые другие ответы не удалили последнюю часть.

sed -n 's/.*\([0-9]\{4\}\).*/\1/p' file | sed ':a;N;$!ba;s/\n/,/g; s/\(.*\),\(.*\)$/\1/g'

Небольшой пример,

$ (echo '| Id   | User |'; echo '| 8192 | root |'; echo '| 8194 | root |'; echo '| 8771 | root |') | sed -n 's+.*\([0-9]\{4\}\).*+\1+p' | sed ':a;N;$!ba;s/\n/,/g; s/\(.*\),\(.*\)$/\1/g'
8192,8194
0
ответ дан 24 May 2018 в 11:25

Другие вопросы по тегам:

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