Использование ‘grep’ и вывод `grep` в качестве переменной во второй команде для получения идентификатора пользователя папок

Я использую следующую commandd, чтобы получить% используемого диска df -h| grep workfld df -h| grep workfld , чем получение верхних папок, которые занимают больше всего дискового пространства в%, последним шагом будет использование вывода / результата из du -h /saswork | sort -rh | head -20 du -h /saswork | sort -rh | head -20 du -h /saswork | sort -rh | head -20 в последней команде grep чтобы получить USERID пользователя, для которого это папка. Чтобы код читался здесь, он разбит на шаги

 df -h| grep saswork du -h /saswork | sort -rh | head -20 ls -la| grep %OUTPUT_FROM_COMMAND_2% 

Какой правильный / самый простой способ сделать это, чтобы я мог сделать это несколько раз, скажем, для 5 лучших папок и получить идентификаторы пользователей этих папок?

поэтому результаты второй команды будут выглядеть примерно так: 569G / saswork / SAS_work438800007078_prdsasgridn03 / SAS_work9A0700007078_prdsasgridn03 569G / saswork / SAS_work438800007078_prdsasgridn03

Там будет 20 лучших результатов, хотя. Часть, которую я хочу использовать в качестве ввода в 3-ей команде, будет именем папки, выделенным жирным шрифтом выше, и это то, что мне нужно, чтобы перейти к третьей команде, поэтому третья команда будет выглядеть следующим образом:

 ls -la| grep SAS_work438800007078_prdsasgridn03 

Вывод этой команды даст мне идентификатор пользователя. Я хочу запустить это для каждого foldername, которое получено из вывода второй команды, которая выполняется.

Добавление для более точного примера

 Input: df -h| grep saswork Output: /dev/mapper/vg_saswork--prd-lv_sas--saswork 3.1T 2.2T 861G 73% /saswork Input: du -h /saswork | sort -rh | head -20 Output: 569G/saswork/SAS_work438800007078_prdsasgridn03/SAS_work9A0700007078_prdsasgridn03 

569G / saswork / SAS_work438800007078_prdsasgridn03 526G / saswork / SAS_work445F00002079_prdsasgridn01 / SAS_work189900002079_prdsasgridn01 526G / saswork / SAS_work445F00002079_prdsasgridn01 165г / saswork / SAS_workBD3300007B7E_prdsasgridn04 / SAS_work154B00007B7E_prdsasgridn04 165г / saswork / SAS_workBD3300007B7E_prdsasgridn04 134g / saswork / SAS_work36E800005097_prdsasgridn04 / SAS_workA86000005097_prdsasgridn04 134g / saswork / SAS_work36E800005097_prdsasgridn04 110G / saswork / SAS_workB87B00002026_prdsasgridn01 / SAS_workD37900002026_prdsasgridn01 110G / saswork / SAS_workB87B00002026_prdsasgridn01 105G / saswork / SAS_work55C800001BDA_prdsasgridn01 / SAS_work849500001BDA_prdsasgridn01 105G / saswork / SAS_work55C800001BDA_prdsasgridn01 57g / saswork / SAS_work3FB700003AAF_prdsasgridn03 / SAS_work826800003AAF_prdsasgridn03 57g / saswork / SAS_work3FB700003AAF_prdsasgridn03 55G / saswork / SAS_work8744000068D9_prdsasgridn01 / SAS_work8CA9000068D9_prdsasgridn01 55G / saswork / SAS_work8744000068D9_prdsasgridn01 46G / saswork / SAS_work400B00002BF F_prdsasgridn02 / SAS_work668100002BFF_prdsasgridn02 46G / saswork / SAS_work400B00002BFF_prdsasgridn02 40G / saswork / SAS_work67780000280E_prdsasgridn02 / SAS_work91E90000gridE

 Input: ls -la| grep **SAS_work438800007078_prdsasgridn03** NOTE: The foldername SAS_work438800007078_prdsasgridn03 came from one of the results from the second command output. That's where I need to pull it from for each one. Output: drwx------. 3 **g6753** ereapp 3864 Jul 12 12:25 AS_work438800007078_prdsasgridn03 Note - bold in this line is the ID of the developer that I need. 

2 Solutions collect form web for “Использование ‘grep’ и вывод `grep` в качестве переменной во второй команде для получения идентификатора пользователя папок”

Чтобы сохранить результат команды в переменной, вам нужно просто обернуть команду между “ или $ ():

 yourvar=`date +%Y` 

или же

 yourvar=$(date +%Y) 

yourvar будет иметь значение текущего года (2018). Вы также можете выполнить результат непосредственно в вашей команде:

 ls -la| grep `date +%Y` 

или же

 ls -la| grep $(date +%Y) 

Чтобы достичь желаемого, я бы использовал цикл for:

 for i in `du -h |sort -rh|awk '{print $2}'|sed "s/.\///g"`;do ls -la |grep $i|awk '{print $3 " " $9}';done 

Имейте в виду, что команда является грубым примером, и ее, возможно, потребуется настроить, чтобы избежать двойных (поскольку, если в вашем каталоге есть подкаталоги, у вас будут различные выходные данные для одного и того же родителя).

Если я правильно понимаю ваш вопрос, вы хотите увидеть список владельцев крупнейших каталогов (в порядке убывания). Другими словами:

  1. Вы хотите отсортировать каталоги по размеру
  2. Найдите идентификатор пользователя каждого из 20 крупнейших каталогов.

Если вы хотите увидеть вывод в формате ls -l , попробуйте это:

 (du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }' | sort --key=5,5hr 

Пример вывода:

 drwxrwxrwx 1 root root 1017G Jun 20 15:44 Raw_data_files drwxrwxrwx 1 root root 188G May 12 11:34 Old_data drwxrwxrwx 1 root root 8.8G Jul 12 15:28 backups drwxrwxrwx 1 root root 1.4G Jun 29 15:32 randomized_sets -rwxrwxrwx 1 root root 124M May 22 10:41 archive_web.html.7z -rwxrwxrwx 1 root root 113M Jan 15 14:51 example1.tif -rwxrwxrwx 1 root root 113M Apr 15 13:27 example3.pdf -rwxrwxrwx 1 root root 1.0M Apr 15 09:17 sample_info.xlsx -rwxrwxrwx 1 root root 1.0M Apr 27 09:20 sample_info2.xlsx -rwxrwxrwx 1 root root 1.0M Jun 12 09:18 sample_run.R 

Как видите, это дает вам отсортированный список (по размеру) всех каталогов и файлов. Но вас интересуют только каталоги / папки, их размер и идентификатор пользователя. Так что если вы добавите простой канал ко всем этим (команда выше) и используете команду grep (т.е. добавьте | grep "^d" --color=never" к команде выше), то вы получите только перечисленные каталоги, и файлы больше не будут перечислены.

 drwxrwxrwx 1 root root 1017G Jun 20 15:44 Raw_data_files drwxrwxrwx 1 root root 188G May 12 11:34 Old_data drwxrwxrwx 1 root root 8.8G Jul 12 15:28 backups drwxrwxrwx 1 root root 1.4G Jun 29 15:32 randomized_sets 

Таким образом, в этом случае полная команда будет выглядеть следующим образом:

 (du -sh ./*; ls -lh --color=no) | awk '{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }' | sort --key=5,5hr | grep "^d" --color=never" 

Все, что вам нужно сделать дальше, это только добавить head -20 к команде выше, чтобы увидеть только 20 самых верхних каталогов.

Весь кредит переходит к пользователю Stabi Overflow Sebi . См. Эту тему в SO для получения дополнительной информации: Использование ls для вывода списка каталогов и их общего размера.

Interesting Posts

ли лимиты групп для пользователя или общие для всех участников?

RHEL Как войти в систему как другой пользователь из оболочки?

Redhat 7.1 Udev Изменяет правила SYMLINK + И Имя

Сценарий ssh ​​запрашивает пароль

Тестирование сети интрасети

Аргумент «искать» в команде dd

Спайк в использовании свопов без высокой скорости обмена

как получить статус выхода из команды в сценарии ожидания

Как я могу написать dmesg из командной строки?

Выполнение `unison -repeat watch` дает ошибку наблюдателя файловой системы

Лучшая практика резервного копирования зашифрованного устройства LUKS

Есть ли способ проверить пользовательский SSH-ключ, чтобы увидеть, является ли кодовая фраза пустой

Повторный ввод кода ключа, сгенерированного мышью

Как я могу заставить FreeBSD `patch` переносить нулевые байты?

Извлечь имена файлов со структурой каталога в CSV-файл (отдельный файл csv для каждого имени изображения)

Linux и Unix - лучшая ОС в мире.