Как удалить из файла только адреса электронной почты из определенного поля?

Вот пример, когда я пытался сделать то же самое в Ubuntu 16.04 для USB-устройства -Ethernet:

anurag@anurag-ThinkPad-E470:~$ lsusb
Bus 002 Device 003: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet
Bus 002 Device 002: ID 0424:5744 Standard Microsystems Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 138a:0011 Validity Sensors, Inc. VFS5011 Fingerprint Reader

Мы хотим отвязать первое устройство. Вы можете увидеть экземпляр драйвера, созданный в sysfs и внутри драйвера, экземпляр адреса шины USB донгла Ethernet :

.
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers$ ls
ax88179_178a  btusb  hub  r8188eu  usb  usbfs  usbhid  uvcvideo
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.2:1.0  bind  module  new_id  remove_id  uevent  unbind

Если вы подключите другой ключ того же типа, вы увидите два устройства:

anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.1:1.0  2-2.2:1.0  bind  module  new_id  remove_id  uevent  unbind

В этот момент вы можете увидеть два сетевых устройства:

anurag@anurag-ThinkPad-E470:~$ ip link show
....
6: enx000ec6cd8d75: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0e:c6:cd:8d:75 brd ff:ff:ff:ff:ff:ff
7: enx000ec6cd8d90: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0e:c6:cd:8d:90 brd ff:ff:ff:ff:ff:ff

Можно так отвязать:

anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ sudo sh -c "echo 2-2.2:1.0 > unbind"
[sudo] password for anurag:
anurag@anurag-ThinkPad-E470:/sys/bus/usb/drivers/ax88179_178a$ ls
2-2.1:1.0  bind  module  new_id  remove_id  uevent  unbind

И устройство больше не будет отображаться в списке интерфейсов:

anurag@anurag-ThinkPad-E470:~$ ip link show
....
6: enx000ec6cd8d75: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0e:c6:cd:8d:75 brd ff:ff:ff:ff:ff:ff

Обратите внимание, что просто выдача sudo echo 2-2.2:1.0 > unbindне работает, потому что это повышает права доступа только для команды echo, а не для перенаправления. Следовательно, мы используем временно повышенную оболочку. Unbind доступен для записи только пользователю root.

0
23.09.2019, 17:43
3 ответа

Попробуйте это.

awk -F\| -vOFS=\| '$7="";1'
0
28.01.2020, 02:22

Использование упрощенного регулярного выражения электронной почты для замены 6-го вхождения |плюс необязательный адрес электронной почты на |(, оставляя не -адреса электронной почты в 7-м поле без изменений):

sed 's/|\([^|@]\+@[^|@]\+\.[a-zA-Z]\{2,\}\)\?/|/6' file
  • s/замена
  • |литерал соответствия|
  • \(начать группу
  • [^|@]\+соответствует одному или нескольким не-|и не-@символам (всем символам до@)
  • @буквальное соответствие@
  • [^|@]\+то же, что и двумя строками выше
  • \.соответствует точке
  • [a-zA-Z]\{2,\}соответствует 2 или более буквам
  • \)конечная группа
  • \?соответствует нулю или одной группе
  • /|/заменить на|
  • 6соответствует 6-му вхождению шаблона
0
28.01.2020, 02:22

(Сценарий отредактирован после того, как к вопросу были добавлены дополнительные требования.)

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } { print }' file

Пояснение:

-F '|' -v OFS='|'установить разделители полей ввода и вывода
$7 ~ /@/условие :столбец 7 содержит@
{ $7 = "" }действие :установить столбец 7 в пустую строку
{ print }безусловное действие :напечатать строку

Этот сценарий предполагает, что в столбце 7 все, что содержит @, является адресом электронной почты и что нет никаких дополнительных данных, которые не являются частью адреса электронной почты.

Как указано в комментарии Валентина Байрами, вы можете опустить оператор printи добавить другое правило, содержащее только 1, которое является «всегда истинным» условием(1)с неявным действием по умолчанию print.

awk -F '|' -v OFS='|' '$7 ~ /@/ { $7 = "" } 1' file

Примечание :В отличие от (отредактированного )примера вывода вопроса, скрипт не удаляет начальный пробел в последней строке образца ввода.

3
28.01.2020, 02:22

Теги

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