Usando 'grep' e a saída de 'grep' como variável no segundo comando para obter o ID do usuário das pastas

0

Estou usando o seguinte comando para obter o% do disco usado df -h| grep workfld , em vez de obter as principais pastas que estão usando mais espaço em disco em%, a última parte seria usar a saída / resultado de du -h /saswork | sort -rh | head -20 no comando final grep para obter o USERID do usuário que é a pasta. Para tornar o código legível aqui, ele é dividido em etapas

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

Qual é a maneira correta / mais fácil de fazer isso para que eu possa fazer isso repetidamente para dizer as 5 principais pastas e obter as IDs de usuário dessas pastas?

então os resultados do segundo comando seriam algo como isto: 569G / saswork / SAS_work438800007078_prdsasgridn03 / SAS_work9A0700007078_prdsasgridn03 569G / saswork / SAS_work438800007078_prdsasgridn03

Haveria os 20 melhores resultados. A parte que eu quero usar como entrada no 3º comando seria o nome da pasta em negrito acima é o que eu precisaria para entrar no terceiro comando, então o terceiro comando ficaria assim:

ls -la|  grep SAS_work438800007078_prdsasgridn03

Esta saída de comandos me dará o userID. Eu quero executar isso para cada nome de pasta que é produzido a partir da saída do segundo comando que é executado.

Adicionando para um exemplo mais exato

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 165G / saswork / SAS_workBD3300007B7E_prdsasgridn04 / SAS_work154B00007B7E_prdsasgridn04 165 g / 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 105 g / 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_work400B00002BFF_prdsasgridn02 / SAS_work668100002BFF_prdsasgridn02 46G / saswork / SAS_work400B00002BFF_prdsasgridn02 40G / saswork / SAS_work67780000280E_prdsasgridn02 / SAS_work91E90000280E_prdsasgridn02

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.
    
por rpt124 18.07.2018 / 15:31

2 respostas

0

Para manter o resultado de um comando em uma variável, basta enrolar o comando entre '' ou $ ():

yourvar='date +%Y'

ou

yourvar=$(date +%Y)

yourvar terá o valor do ano atual (2018). Você também pode executar o resultado diretamente no seu comando:

ls -la|  grep 'date +%Y'

ou

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

Para conseguir o que você quer, eu usaria um loop:

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

Tenha em mente que o comando é um exemplo grosseiro e pode precisar ser modificado para evitar duplas (já que se o seu diretório tiver subdiretórios, você terá várias saídas para o mesmo pai).

    
por 18.07.2018 / 16:23
0

Se eu entendi sua pergunta corretamente, você deseja ver uma lista do proprietário dos maiores diretórios (em ordem decrescente). Em outras palavras:

  1. Você deseja classificar diretórios com base no tamanho deles
  2. Encontre o ID do usuário de cada um dos 20 principais diretórios maiores.

Se você quiser ver a saída no formato ls -l , tente o seguinte:

(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

Exemplo de saída:

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

Como você pode ver, isso fornece uma lista classificada (com base no tamanho) de todos os arquivos e dos diretórios. Mas você está interessado apenas em diretórios / pastas e seu tamanho e id de usuário. Portanto, se você adicionar um pipe simples a tudo isso (o comando acima) e usar o comando grep (isto é, adicionar | grep "^d" --color=never" ao comando acima), você só terá os diretórios listados e os arquivos não serão mais listados.

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

Portanto, neste caso, o comando completo será o seguinte:

(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"

Tudo o que você precisa fazer agora é adicionar apenas head -20 ao comando acima para ver apenas os 20 maiores diretórios.

Todo o crédito vai para o usuário do Stack Overflow Sebi . Veja este tópico em SO para mais informações: Usando ls para listar diretórios e seus tamanhos totais

    
por 18.07.2018 / 16:19