Требуется объяснение для команды «find | awk» (Linux)

#linux #shell #awk

#linux #оболочка #awk

Вопрос:

Я пытаюсь разобраться в приведенной ниже команде;

 find ./ -type f |
awk -F / -v OFS=/ '{$NF="";dir[$0]  } END {for (i in dir) print dir[i]i}'
  

вывод выглядит следующим образом:

 6./Release_1_18_1_0_06_26/metadata/3_Control_Files/   
5./Release_1_18_1_0_06_26/metadata/7_SAS_Code/   
5./Release_1_18_1_0_06_26/others/1_content/   
1./.cache/pip/selfcheck/   
2./Release_1_18_1_0_06_26/metadata/5_Status/   
1./Release_1_18_1_0_06_26/compute/2_packages/   
1./sasuser.v94/   
4./metadata/FR1_Release_1.17.1.1/3_Control_Files/   
4./Release_1_18_1_0_06_26/metadata/6_Patches/   
  

Эта команда подсчитывает количество инкодов в текущем пути. Однако я не понял {$NF="";dir[$0] } END {for (i in dir) print dir[i]i} , особенно dir[$0] . кто-нибудь может это объяснить?

Ответ №1:

Не могли бы вы, пожалуйста, ознакомиться со следующим подробным объяснением кода OP здесь.

 find ./ -type f |     ##Running find command to find files in current directory and passing output as input to awk command.
awk -F / -v OFS=/ '   ##Running awk command setting field separator and output field separator as /
{
  $NF=""              ##Nullifying last field of current line here.
  dir[$0]             ##creating array dir with current line and keep increasing its value with one here.
}
END{                  ##starting END block of this code here.
  for(i in dir){      ##traversing through dir array here.
    print dir[i]i     ##printing index of dir array and it's index here.
  }
}'
  

ПРИМЕЧАНИЕ: END блок любого awk кода выполняется, когда Input_file наконец завершается чтением.

Комментарии:

1. Неплохо. dir[$0] может запомнить последний отсчет для своей строки, поэтому массив может увеличить значение.

Ответ №2:

-F / Указывает awk разделить строку косыми чертами. $0 это целая строка.

$NF="" заменяет последний элемент в строке (в данном случае имя файла) пустым.

Затем dir[$0] берет всю строку (после того, как имя файла было удалено) и использует ее в качестве индекса в хэше, увеличивая это значение на единицу. Эффективный подсчет количества элементов, у которых был один и тот же путь.

END Блок перебирает все ключи в dir[] хэше, выводя сначала количество, затем имя каталога.