Извлечение имен из LDAP Long Names

В общем, вы используете одинарные кавычки '...', чтобы обернуть "выполнение команды", которое должно быть обернуто обратными кавычками `...`, или (гораздо лучше) $(...).

Это делает строку, начинающуюся с: для LINE в 'grep и заканчивается на. }'' проваливается.
Сделав минимально возможные изменения, код становится:

#!/bin/bash

OLDIFS=${IFS}
IFS=$'\n'

head -1 50000_a.csv | sed 's/"//g'
for LINE in `grep WV 50000_a.csv | sed 's/"//g' | awk -F, '{print $(NF-11) "," \
    $(NF-10)"," \
    $(NF-9)"," \
    $(NF-8)"," \
    $(NF-7)"," \
    $(NF-6)"," \
    $(NF-5)"," \
    $(NF-4)"," \
    $(NF-3)"," \
    $(NF-2)"," \
    $(NF-1)"," \
    $NF \
}'`
do
    FNAME=`echo ${LINE} | awk -F, '{print $1}'`
    LNAME=`echo ${LINE} | awk -F, '{print $2}'`
    COMPANY=`echo ${LINE} | awk -F, '{print $3}'`
    ADDRESS=`echo ${LINE} | awk -F, '{print $4}'`
    CITY=`echo ${LINE} | awk -F, '{print $5}'`
    COUNTY=`echo ${LINE} | awk -F, '{print $6}'`
    STATE=`echo ${LINE} | awk -F, '{print $7}'`
    ZIP=`echo ${LINE} | awk -F, '{print $8}'`
    PHONE=`echo ${LINE} | awk -F, '{print $9}'`
    FAX=`echo ${LINE} | awk -F, '{print $10}'`
    EMAIL=`echo ${LINE} | awk -F, '{print $11}'`
    WEB=`echo ${LINE} | awk -F, '{print $12}'`
done

Однако, это ошибка - пытаться обработать файл с помощью цикла for, вы должны использовать read, чтобы получить вывод grep:

#!/bin/bash

OLDIFS=${IFS}
IFS=$'\n'

head -1 50000_a.csv | sed 's/"//g'
while IFS=$'\n' read -r LINE
do
    FNAME="$(echo ${LINE} | awk -F, '{print $1}')"
    LNAME="$(echo ${LINE} | awk -F, '{print $2}')"
    COMPANY="$(echo ${LINE} | awk -F, '{print $3}')"
    ADDRESS="$(echo ${LINE} | awk -F, '{print $4}')"
    CITY="$(echo ${LINE} | awk -F, '{print $5}')"
    COUNTY="$(echo ${LINE} | awk -F, '{print $6}')"
    STATE="$(echo ${LINE} | awk -F, '{print $7}')"
    ZIP="$(echo ${LINE} | awk -F, '{print $8}')"
    PHONE="$(echo ${LINE} | awk -F, '{print $9}')"
    FAX="$(echo ${LINE} | awk -F, '{print $10}')"
    EMAIL="$(echo ${LINE} | awk -F, '{print $11}')"
    WEB="$(echo ${LINE} | awk -F, '{print $12}')"
done < <(
    grep WV 50000_a.csv | sed 's/"//g' | awk -F, '{print $(NF-11) "," \
    $(NF-10)"," \
    $(NF-9)"," \
    $(NF-8)"," \
    $(NF-7)"," \
    $(NF-6)"," \
    $(NF-5)"," \
    $(NF-4)"," \
    $(NF-3)"," \
    $(NF-2)"," \
    $(NF-1)"," \
    $NF \
    }'
)

1
09.10.2018, 22:52
3 ответа

можно выполнить с помощьюsed:

sed 's/^.*cn=\([^,]*\).*$/\1/' file

jsmith
bjones

илиgrep

grep -oP  '(?<=cn=)[^, ]+' file

илиperl

perl -lne '/cn=(\w*),/ && print $1' file

или cutиtr

cut -d'=' -f2 file | tr -d 'ou,'
2
27.01.2020, 23:11

с помощьюsed:

sed -e 's/.*cn=\(.*\),ou.*/\1/' file

с помощьюawk

awk -F '[=,]' '{print $2}' file

или

awk -F 'cn=|,' '{print $2}' file
4
27.01.2020, 23:11
% < input
2015-12-02 10:55:32Z cn=jsmith,ou=sales,dc=company,dc=com
2015-12-02 10:55:54Z cn=bjones,ou=sales,dc=company,dc=com
% perl -nle 'print $1 if m/ cn=([^,]+)/' input
jsmith
bjones

в предположении, что запятая не будет появляться в имени записи (, что делает регулярное выражение быстрым )и что cn=не появляется больше нигде в журнале.

Недостатком этого сопоставления является то, что атрибут может быть очень длинным или содержать символы, вызывающие проблемы в другом месте. Если это вызывает беспокойство, может быть полезно строго определить ограничения на то, что могут содержать атрибуты cn, а затем сопоставить это определение, например. cn=([a-z][a-z0-9]{1,63})предполагается, что атрибуты могут быть только в нижнем регистре, начинаться с буквы и иметь длину от 2 до 64 символов. Это может вызвать проблемы, если появятся атрибуты длиннее 64 символов, но, с другой стороны, не позволит обратным кавычкам или подстановкам пройти через этот плохой код, который может привести к нежелательным последствиям.

3
27.01.2020, 23:11

Теги

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