Intereting Posts
Проблема с сетью – только одна машина не может получить доступ к веб-странице на другом компьютере Я перепутал свои системные часы в Arch Linux Требуется ли своп на непрерывном логическом томе LVM Как освободить экстенты физического объема? lvm, зашифрованный Файловая система-ACL (setfacl) Эквивалентна «mkdir -p» для рекурсивной обработки ACL Различные двоичные файлы сна на Mac (Darwin) и в Linux. Как правильно обрабатывать различия? Как заставить API evdev использовать API-интерфейс Joystick? Debian не может перезагружаться и запрашивать пароль root (обслуживание) notify-send не может указать адресат, и мое уведомление не появляется на экране. Зачем? Является ли busybox cpio THAT отличным от GNU cpio? Где я могу поместить настройки, которые запускаются с помощью root, и последние от начала ОС до ее завершения? Как исправить ошибку ввода-вывода на внешнем жестком диске? Мышь и клавиатура не работают в FreeBSD 9.0 Процесс Thread в linux Ошибка или функция? Grep принимает файлы как флаги

Как разбить строку – Bash

У меня есть список строк со следующим форматом. Какие команды можно использовать для извлечения соответствующих разделов. Я думал использовать grep для извлечения ключевых слов: ADD, username (atra522) и т. Д. Как мне подойти к этой проблеме?

cop1010 ADD atra522,Allison Track,CT,canada 

Я знаю, как использовать cut или awk для получения всех полей путем поиска запятых, но я не знаю, как заставить его работать с первым полем «cop1010 ADD atra522».

Вы сказали bash , поэтому давайте сделаем все это с помощью встроенных оболочек:

 $ inp="cop1010 ADD atra522,Allison Track,CT,canada" $ IFS=, fields=($inp) $ echo ${fields[0]} cop1010 ADD atra522 $ echo ${fields[1]} Allison Track $ echo ${fields[2]} CT $ echo ${fields[3]} canada $ IFS=\ cmd=(${fields[0]}) $ echo ${cmd[0]} cop1010 $ echo ${cmd[1]} ADD $ echo ${cmd[2]} atra522 $ 

Вы можете установить их все как переменные (вместо того, чтобы повторять их), и никогда не нужно создавать подоболочку для запуска awk , cut или любого другого инструмента.

Вы можете использовать функцию split awk для дальнейшего разбиения первого поля на массив, например

 echo 'cop1010 ADD atra522,Allison Track,CT,canada' | awk -F, '{ split($1,a,"[ \t]+"); if (a[2] == "ADD") { printf "Adding user: %s\n", a[3]; } }' 

Решение Python:

 import re,sys; for l in sys.stdin: if 'ADD' in l: data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] print " ".join(data) data = [] 

Протестировано с помощью пользовательского файла на основе примера OP:

 $ cat input.txt cop1010 ADD atra522,Allison Track,CT,canada some other stuff testuser ADD test522,Allison TEST,CT,germany $ python user_data.py < input.txt atra522 Allison Track CT canada test522 Allison TEST CT germany 

Для совместимости с python 3 и довольно большой печати данных мы могли бы сделать что-то вроде этого:

 $ cat user_data.py from __future__ import print_function import re,sys; for l in sys.stdin: if 'ADD' in l: data = [re.split(",",l.rstrip("\n"))[0].split()[-1]]+re.split(",",l.rstrip("\n"))[1:] print("Username: " + data[0]) print("Real Name: " + data[1]) print("Some kind of two char string: "+ data[2]) print("Location: " + data[3]) print("- - -") data = [] $ python user_data.py < input.txt Username: atra522 Real Name: Allison Track Some kind of two char string: CT Location: canada - - - Username: test522 Real Name: Allison TEST Some kind of two char string: CT Location: germany - - -