Изменить только один пробел между символами в bash - PullRequest
0 голосов
/ 11 мая 2018

У меня есть вывод, как показано ниже:

NAME                UUID                                  TYPE            DEVICE 
Wired connection 1  e4249ef0-c4f0-3b64-8950-0c6be3edaca5  802-3-ethernet  enp0s3 

Я хочу выбрать имя устройства, если тип имеет wireless, упомянутое в нем, используя awk.

Expected output:
enp0s3

Однако есть одна проблема.NAME иногда может быть одним словом, и в этом случае awk может распознавать TYPE и DEVICE как field 3 & 4.

awk '$3 ~ /wireless/{ print $4 }'

Но у NAME иногда есть spaces между ними, с которым я сначала хочу разобраться, прежде чем применить awk, иначе он ведет себя хаотично.если я смогу заменить одиночные пробелы на "-", это решит мою задачу.

Предложения, пожалуйста.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Первые лучшие тестовые данные (т. Е. Со совпадением):

$ cat file
NAME                UUID                                  TYPE            DEVICE 
Wired connection 1  e4249ef0-c4f0-3b64-8950-0c6be3edaca5  802-3-ethernet  enp0s3 
Wireless conn       e4249ef0-c4f0-3b64-8950-0c6be3edaca5  802-3-wireless  enp0s3 

Затем сценарий GNU awk на основе сценария @ EdMorton для работы с данными фиксированной ширины (который, мне кажется, должен использоватьмного, очень плохо, я не могу дать больше ++, здесь ):

awk '
FNR==1 {
    FIELDWIDTHS=""
    while ( match($0,/\S+\s*/) ) {
        FIELDWIDTHS = (FIELDWIDTHS ? FIELDWIDTHS " " : "") RLENGTH
        $0 = substr($0,RSTART+RLENGTH)
    }
    next
}
$3~/wireless/ { print $4 }
' file
Wireless conn

Отредактировано для печати $4 вместо $1 какОП уточнил вопрос.

0 голосов
/ 11 мая 2018

Вы сказали, что хотите напечатать «имя устройства», поэтому мы не знаем, хотите ли вы напечатать поле «УСТРОЙСТВО» или поле «ИМЯ», так что мы все просто догадываемся. Вот почему так важно включить ожидаемый результат в любой вопрос.

Чтобы напечатать поле УСТРОЙСТВО:

awk '$(NF-1) ~ /wireless/ { print $NF }' file

Чтобы напечатать поле ИМЯ:

awk '$(NF-1) ~ /wireless/ { sub(/([[:space:]]+[^[:space:]]+){3}[[:space:]]*$/,""); print }' file

Это будет работать независимо от того, какой пробел содержится в вашем файле между полями, если только само поле NAME может содержать пробел.

0 голосов
/ 11 мая 2018

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

awk 'NR == 1 { start = index($0, $3); end = index($0, $4); next }
     substr($0, start, end - start) ~ /less/ { print $NF }' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...