Выполнять команды Perl с определенного IP-адреса?

Так как соглашениеp , похоже, отсутствует в вашей системе, обратите внимание на эту альтернативу, основанную на sed и awk, для применения grep и работы с шаблонами, считываемыми локальным файлом.

PS: Поскольку вы используете osx, я не уверен, поддерживает ли ваша версия awk указанное ниже использование.

awk может имитировать grep с помощью операции И для нескольких шаблонов в этом случае:
awk '/ pattern1 / && / pattern2 / && / pattern3 /'

Таким образом, вы можете преобразовать файл шаблона следующим образом:

$ cat ./tmp/d1.txt
"surveillance data" "surveillance technology" "cctv camera"
"social media" "surveillance techniques" "enforcement agencies"
"social control" "surveillance camera" "social security"
"surveillance data" "security guards" "social networking"
"surveillance mechanisms" "cctv surveillance" "contemporary surveillance"

На это:

$ sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' ./tmp/d1.txt
/surveillance data/ && /surveillance technology/ && /cctv camera/
/social media/ && /surveillance techniques/ && /enforcement agencies/
/social control/ && /surveillance camera/ && /social security/
/surveillance data/ && /security guards/ && /social networking/
/surveillance mechanisms/ && /cctv surveillance/ && /contemporary surveillance/

PS: Вы можете перенаправить вывод в другой файл, используя > другой файл в конце, или вы можете использовать параметр sed -i , чтобы сделать изменения на месте в том же файле шаблонов условий поиска.

Затем вам просто нужно загрузить в awk шаблоны в формате awk из этого файла шаблонов:

$ while IFS= read -r line;do awk "$line" *.txt;done<./tmp/d1.txt #d1.txt = my test pattern file

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

while IFS= read -r line;do 
  line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line")
  awk "$line" *.txt
done <./tmp/d1.txt

Или однострочно:

$ while IFS= read -r line;do line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line"); awk "$line" *.txt;done <./tmp/d1.txt

Приведенные выше команды возвращают правильные результаты И в моих тестовых файлах, которые выглядят следующим образом:

$ cat d2.txt
This guys over there have the required surveillance technology to do the job.
The other guys not only have efficient surveillance technology, but they also gather surveillance data by one cctv camera.

$ cat d3.txt
All surveillance data are locked.
All surveillance data are locked and guarded by security guards.
There are several surveillance mechanisms (i.e cctv surveillance, contemporary surveillance, etv)

Результаты:

$ while IFS= read -r line;do awk "$line" *.txt;done<./tmp/d1.txt
#or while IFS= read -r line;do line=$(sed 's/" "/\/ \&\& \//g; s/^"/\//g; s/"$/\//g' <<<"$line"); awk "$line" *.txt;done <./tmp/d1.txt
The other guys not only have efficient surveillance technology, but they also gather surveillance data by one cctv camera.
There are several surveillance mechanisms (i.e cctv surveillance, contemporary surveillance, etv)

Обновление:
Вышеупомянутое решение awk выводит содержимое совпадающих файлов txt.
Если вы хотите отображать имена файлов вместо содержимого, используйте следующий awk там, где это необходимо:

awk "$line""{print FILENAME}" *.txt
1
26.11.2018, 01:21
0 ответов

Теги

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