Там пара ошибок.
Во-первых, так как sed
использует основные регулярные выражения, то для создания группы захвата необходимо \(
и \)
. Переключатель -r
включает расширенные регулярные выражения, поэтому вы не получите ошибку. Смотрите Почему мне нужно экранировать регексные символы в sed для их интерпретации как регексные символы?.
Во-вторых, вы помещаете группу захвата не в то место. Если я вас правильно понял, вы можете это сделать:
sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file
Обратите внимание на использование !
в качестве разделителей регрессов, чтобы избежать необходимости избегать прямых косых черт в /dev/stdout
.
В оригинальном вопросе действительно несколько независимых запросов, но ответ на "какая книга взяла кредит" с помощью awk может выглядеть следующим образом:
cat book.sh
#!/bin/bash
awk -F"," -v acc=$1 '
{
for(i=2;i<=NF;i++){
if($i ~ acc ){
print $1
}
}
}' Books.txt
Что дает нам вывод типа:
$ ./book.sh 4
BOOK1234
BOOK0999
Perl - отличный язык обработки текста. Его синтаксис может быть ... удивительным, но его структуры данных чрезвычайно гибкие:
perl -F, -lane '
$book = shift @F;
$books{$book} = [@F];
push @{$users{$_}}, $book for @F;
}
END {
$book="BOOK1234";
printf "book %s has been borrowed %d times, by users %s\n",
$book,
scalar(@{$books{$book}}),
join(",",@{$books{$book}});
$user="1";
printf "user %s has borrowed %d books, %s\n",
$user,
scalar(@{$users{$user}}),
join(",",@{$users{$user}})
' Books.txt
book BOOK1234 has been borrowed 4 times, by users 1,2,3,4
user 1 has borrowed 2 books, BOOK1234,BOOK2334
Есть несколько вариантов сделать это
Вы можете grep файл для номера книги, а затем grep для счета
# grep account books.txt | cut -d "," -f1
, который выводит это
BOOK0999
Или вы можете использовать awk, чтобы отфильтровать то, что вам нужно
awk -F ',' '/9/ { распечатать $1}. ' book.txt
который выводит это
BOOK0999
Если бы вы хотели скрипт, вы могли бы сделать это таким образом
#!/bin/bash
acct=$1
while read line; do
if [[ $line =~ $1 ]]; then
echo $line | cut -d "," -f1
fi
done < books.txt
и запустить скрипт с ./скрипт acctno