В общем, вы используете одинарные кавычки '...'
, чтобы обернуть "выполнение команды", которое должно быть обернуто обратными кавычками `...`
, или (гораздо лучше) $(...)
.
Это делает строку, начинающуюся с: для 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 \
}'
)
можно выполнить с помощью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,'
с помощьюsed
:
sed -e 's/.*cn=\(.*\),ou.*/\1/' file
с помощьюawk
awk -F '[=,]' '{print $2}' file
или
awk -F 'cn=|,' '{print $2}' file
% < 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 символов, но, с другой стороны, не позволит обратным кавычкам или подстановкам пройти через этот плохой код, который может привести к нежелательным последствиям.