awk находит строки с двумя совпадениями

Большое спасибо. Я использовал предоставленные вами решения для создания своих нужд. :)

awk '/#define.*\/$/{cnt[$2]++}END{for(i in cnt)print i}' > macro_names

#!/usr/local/bin/bash -x
TotalCount=0
CurrFileTotalCount=0
#takes One $macro after other from macro_names.txt file
for macro in $(cat macro_names); 
do
    #Takes $files from the current path in a recursive manner 
    #<$(find . -type f -name "*.c" -o -name "*.h")
    for files in $(find . -type f -name "*.c" -o -name "*.h")
    do
        #Counts the number of times $macro is present in $files
         CurrFileTotalCount=$(grep -c $macro "${files}");
         #Adds the Current file count to $TotalCount
         TotalCount=$(($TotalCount+$CurrFileTotalCount));
         #print the $CurrFileTotalCount and $TotalCount PROPERLY
    done 
    #Expected to print how many times that $macro is present in the files -- BUT PRINTS $TotalCount AS 0
    echo $macro appears_3 TotalCount $TotalCount
    TotalCount=0;
done
0
18.01.2017, 00:30
2 ответа

В регулярных выражениях . соответствует любому символу, а * - это квалификатор, который вы добавляете к чему-то, чтобы сказать 0 или более из этого чего-то . Итак, . * - любое число (0 или более) из символов .

Итак, как сказал Анджело, вы можете сделать:

awk '/^To.*day$/'

Начало записи ( ^ ), за которым следует До , за которым следует любое количество символов (. * ), за которым следует день , за которым следует конец записи ( $ ).

В качестве альтернативы вы можете написать:

awk '/^To/ && /day$/'

Это также будет соответствовать записям, в которых то, что находится между до и день , не содержит символов. Другое отличие будет в случаях, например, когда вы замените на / день на abc / cde , который будет соответствовать abcde .

4
28.01.2020, 02:16
awk '$0 ~ /^To.*day$/  {print}' file

или просто

awk '/^To.*day$/  {print}' file

или даже (поскольку действие по умолчанию - распечатать запись):

awk '/^To.*day$/' file
2
28.01.2020, 02:16

Теги

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