- cat, grep and cut — translated to python
- 5 Answers 5
- Combining
- Как сделать cat file | grep text > file?
- Как вывести содержимое файла Linux? Открываем текстовый файл в Linux
- Просмотр текстового файла в Linux полностью
- Как просмотреть файл в Linux с прокруткой
- Просматриваем начало или конец файла в Linux
- Просматриваем содержимое файла по шаблону в Linux
- Просматриваем Linux-файл в сжатом виде
cat, grep and cut — translated to python
maybe there are enough questions and/or solutions for this, but I just can’t help myself with this one question: I’ve got the following command I’m using in a bash-script:
var=$(cat "$filename" | grep "something" | cut -d'"' -f2)
Now, because of some issues I have to translate all the code to python. I never used python before and I have absolutely no idea how I can do what the postet commands do. Any ideas how to solve that with python?
You asked for feedback, so I provided it. Your question is more or less «write me some python to do this» without showing any effort yourself or where you got stuck. If you tried and failed, then people will be more likely to want to help you and less likely to downvote if you include your efforts and show where you got stuck.
Maybe lose the bad attitude as well, people are trying to help you. Dumping a load of failed attempts in a question is no more useful than simply asking for the answer. You need to make it clear what you don’t understand and ask a clear, focused question, then you will rightfully be upvoted.
5 Answers 5
You need to have better understanding of the python language and its standard library to translate the expression
cat «$filename»: Reads the file cat «$filename» and dumps the content to stdout
| : pipe redirects the stdout from previous command and feeds it to the stdin of the next command
grep «something»: Searches the regular expression something plain text data file (if specified) or in the stdin and returns the matching lines.
cut -d'»‘ -f2: Splits the string with the specific delimiter and indexes/splices particular fields from the resultant list
cat "$filename" | with open("$filename",'r') as fin: | Read the file Sequentially | for line in fin: | ----------------------------------------------------------------------------------- grep 'something' | import re | The python version returns | line = re.findall(r'something', line)[0] | a list of matches. We are only | | interested in the zero group ----------------------------------------------------------------------------------- cut -d'"' -f2 | line = line.split('"')[1] | Splits the string and selects | | the second field (which is | | index 1 in python)
Combining
import re with open("filename") as origin_file: for line in origin_file: line = re.findall(r'something', line) if line: line = line[0].split('"')[1] print line
Как сделать cat file | grep text > file?
Да. В пайпе можно чем-нибудь собрать все данные, а потом в тот же файл залить?
Не, у меня длинный паровоз может быть.
cat $file | grep text > $file.tmp && mv $file.tmp $file
А без временного нельзя :).
Может и можно придумать какой-то хитрый хак, но делать этого не стоит.
Deleted ( 29.12.17 06:16:14 MSK )
Последнее исправление: Deleted 29.12.17 06:17:50 MSK (всего исправлений: 1)
Я видел где-то, что так делается, но забыл как.
В пайпе можно чем-нибудь собрать все данные [в память], а потом в тот же файл залить?
Можно, конечно. Вас готовые утилитки интересуют? sponge(1).
Но делать так не надо. Для редактирования файлов существуют файловые редакторы.
почему? он же через временный файл это делает, просто это скрыто от юзера.
А точнее потому, что это не временный файл, а новый постоянный. Что в корне противоречит принципу наименьшего удивления.
Zmicier ★★★★★ ( 29.12.17 06:35:02 MSK )
Последнее исправление: Zmicier 29.12.17 06:35:37 MSK (всего исправлений: 1)
Но делать так не надо. Для редактирования файлов существуют файловые редакторы.
У меня не продакшен. Слеши убрать, кавычки после jq и пр муть.
мне кажется, что вы педант
Суть проблемы в том, что перенаправление >file работает ДО cat (а также и до grep . file).
Попробуйте подать данные на вход тоже перенаправлением.
$file=`cat file`; echo $file | grep text > file
И что? Как это мешает использовать для редактирования файлов файловые редакторы вместо костылей?
$ file=`cat file`; echo $file | grep text > file
Zmicier ★★★★★ ( 29.12.17 06:49:31 MSK )
Последнее исправление: Zmicier 29.12.17 06:49:48 MSK (всего исправлений: 1)
А как правильно в таком случае сделать?
Это тот случай, когда лечение хуже болезни. Результат априори будет уродливее и ненадежнее, чем временный файл.
bormant ★★★★★ ( 29.12.17 07:10:55 MSK )
Последнее исправление: bormant 29.12.17 07:19:23 MSK (всего исправлений: 2)
Ну, если очень хочется именно так, то как-то так, наверное:
buf=$(grep 'regex' "$file") printf '%s' "$buf" > "$file"
Zmicier ★★★★★ ( 29.12.17 07:13:06 MSK )
Последнее исправление: Zmicier 29.12.17 07:14:05 MSK (всего исправлений: 1)
Как это мешает использовать для редактирования файлов файловые редакторы вместо костылей?
Костыли приросшие к рукам.
Ну так вопросы еще осталися?
Собственно, все решения, предложенные в треде — обоснование убедительнее некуда. Бóльшая их часть ТСу вообще непригодны, ибо не позволяют использовать паровоз из нескольких грепов.
cat file | grep text | tee file
В зависимости от сочетания звезд это тоже файл может обнулять.
Спасибо, вы правы. На больших файлах всё встало колом.
Надёжнее использовать временный файл или утилиту, предназначенную специально для подобных фокусов:
cat file | grep text | sponge file
Я избегаю использовать утилиты, не входящие в базовую установку популярных дистрибутивов. Хотя для локалхоста годится.
➜ ~ echo "one" > src ➜ ~ grep "ne" src | tee src one
а moreutils не везде есть? просто не знаю
Так делать нельзя. Ибо нет гарантий, что файл не будет обрезан.
$ seq 1000000 > src $ grep 5 src | wc -l 468559 $ grep 5 src | tee src $ wc -l src 2586 src
офтоп конечно, но с чем это связано? какие-то рестрикты и полиси на предприятии?
просто даже до линукса стали доходить тренда наделять утилиты возможностью выдавать информацию в json, но упомянутый уже jq, в базовую поставку ещё долго не войдёт.
я к тому, что список ПО для базовой установки не доктора наук составляют, чего на них ровняться?
user@localhost /tmp $ ls > file user@localhost /tmp $ grep konsole file konsole-B11999.history konsole-E11999.history konsole-t11999.history user@localhost /tmp $ grep konsole file | tee file user@localhost /tmp $ cat file user@localhost /tmp $
Просто не хочу чтобы мои скрипты выкидывали command not found на ровном месте. Если иначе не обойтись — ничего не поделаешь, а в угоду «хочу однострочник» — нафиг.
Как вывести содержимое файла Linux? Открываем текстовый файл в Linux
Если вы работаете с операционной системой Linux, вы должны уметь быстро и правильно просматривать содержимое Linux-файлов, используя терминал. В этой статье мы изучим команды, посредством которых можно открывать текстовые файлы Linux. И поговорим о том, как следует ими пользоваться.
Просмотр текстового файла в Linux полностью
Чтобы вывести содержимое всего текстового файла, в Linux используют команду cat. Она отлично походит для вывода небольших текстовых файлов, к примеру, конфигурационных файлов. Синтаксис прост:
Представьте, что надо посмотреть содержимое файла с названием myfile.txt:
Также можно вместо имени прописать адрес (путь) к файлу:
Если нужно посмотреть несколько файлов сразу, это тоже не вызовет проблем:
Кроме того, при просмотре текстового файла в Linux мы можем отобразить номера строк. Для этого потребуется всего лишь использовать опцию -n :
Команда nl функционирует аналогично команде cat с опцией -n , выводя номера строк в столбце слева.
При необходимости вы можете сделать так, чтобы при выводе текстового файла в конце каждой строки отображался символ $ :
hello everyone, how do you do?$ $ Hey, am fine.$Кроме cat, для вывода содержимого текстового файла в Linux используется команда tac. Её разница заключается в том, что она выводит содержимое файла в обратном порядке.
Как просмотреть файл в Linux с прокруткой
Бывает, что текстовый файл большой, поэтому его содержимое не помещается в один экран. Использовать в таком случае cat неудобно, зато есть less. Синтаксис у неё такой же:
Команда less обеспечит постраничный просмотр, что очень удобно. При этом: 1) less позволяет просматривать текст по определённому числу строк, для чего достаточно указать - (тире или минус) и количество строк:
2) можно начать просмотр с конкретной строки в файле, указав + (плюс) и номер строки, с которой хотим начать чтение:
Открыв текст, мы можем управлять его просмотром:
Просматриваем начало или конец файла в Linux
Порой, нам не нужно выводить содержимое всего файла и мы хотим, к примеру, посмотреть лишь несколько строчек лога. Такое часто бывает, если мы подозреваем, что в начале или в конце конфигурационного файла есть ошибки. Для решения данного вопроса у нас существуют команды head и tail (как вы уже догадались, это голова и хвост).
Команда head по умолчанию показывает лишь 10 первых строчек в текстовом файле в Linux:
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false adm:x:3:4:adm:/var/adm:/bin/false lp:x:4:7:lp:/var/spool/lpd:/bin/false sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt news:x:9:13:news:/var/spool/news:/bin/false uucp:x:10:14:uucp:/var/spool/uucp:/bin/falseКстати, тут мы тоже можем открыть сразу несколько текстовых файлов в Linux одновременно. Вот просмотр сразу двух файлов:
Если же вас не интересуют все 10 строчек, то, как и в случае с cat, можно использовать опцию –n , цифрой указывая число строк к выводу:
В итоге мы вывели только пять строк:
1394924012: Started emerge on: Mar 15, 2014 22:53:31 1394924012: *** emerge --sync 1394924012: === sync 1394924012: >>> Synchronization of repository 'gentoo' located in '/usr/portage'. 1394924027: >>> Starting rsync with rsync://212.113.35.39/gentoo-portageПо правде говоря, букву n можно и не использовать, достаточно просто передать цифру:
Кстати, выводить содержимое текстового файла в Linux можно не построчно, а посимвольно. Давайте зададим число символов, которое нужно вывести (используем опцию -с ):
1394924012: Started emerge on: Mar 15, 2014 2Не верите, что их действительно 45? Проверить можно командой wc:
head -c45 /var/log/emerge.log | wc -c 45С «головой» разобрались, давайте поговорим про «хвост». Очевидно, что команда tail работает наоборот, выводя десять последних строк текстового Linux-файла:
Количество строк при выводе тоже можно менять. Однако в tail есть такая полезная опция, как -f . С её помощью содержимое текстового файла будет постоянно обновляться, в результате чего вы станете видеть изменения сразу (постоянно открывать и закрывать файл не придётся). Это весьма удобно, если вы хотите просматривать логи Linux в реальном времени:
Просматриваем содержимое файла по шаблону в Linux
На практике зачастую нам необходим не весь текстовый файл, а лишь несколько строк из него. Используя grep, мы можем вывести Linux-файл, предварительно отсеяв лишнее:
Команду можно применять и совместно с cat:
cat файл | grep опции шаблонДавайте выведем из лога лишь предупреждения:
cat /var/log/Xorg.0.log | grep WW(WW) warning, (EE) error, (NI) not implemented, (??) unknown. [ 85.839] (WW) Hotplugging is on, devices using drivers 'kbd', 'mouse' or 'vmmouse' will be disabled. [ 85.839] (WW) Disabling Keyboard0 [ 85.839] (WW) Disabling Mouse0 [ 87.395] (WW) evdev: A4TECH USB Device: ignoring absolute axes.Есть и ряд полезных опций: -A , -B , -C . Допустим, нам надо выполнить вывод двух строк после вхождения enp2s0:
enp2s0: flags=4163 mtu 1500 inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::beae:c5ff:febe:8bb7 prefixlen 64 scopeid 0x20
А теперь, то же самое, но до вхождения loop:
inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 0 (Local Loopback)Можно по две строки как до, так и после loop:
inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 0 (Local Loopback) RX packets 9810 bytes 579497 (565.9 KiB) RX errors 0 dropped 0 overruns 0 frameПросматриваем Linux-файл в сжатом виде
Порой, в системе встречаются текстовые файлы в сжатом виде и формате gz. Это могут быть конфигурационные файлы ядра либо логи программ. Открыть такие файлы можно тоже через терминал, не прибегая к распаковке. Для этого существует множество аналогов вышеназванных утилит с той лишь разницей, что они имеют приставку z: zgerp, zegrep, zcat, zless.
Давайте откроем сжатый файл в Linux для просмотра:
Или выполним просмотр сжатого файла с прокруткой:
Вот, пожалуй, и всё. Теперь вы точно в курсе, как правильно открывать и просматривать текстовые файлы в терминале Linux.