在第二个命令中使用“grep”和“grep”的输出作为变量来获取文件夹的用户 ID

在第二个命令中使用“grep”和“grep”的输出作为变量来获取文件夹的用户 ID

我使用以下命令来获取已用磁盘的百分比df -h| grep workfld,而不是获取使用最多磁盘空间的顶级文件夹(以百分比为单位),最后一部分是使用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 个文件夹重复执行此操作并获取这些文件夹的用户 ID?

因此第二个命令的结果如下所示: 569G/saswork/SAS_work438800007078_prdsasgridn03/SAS_work9A0700007078_prdsasgridn03 569G/saswork/SAS_work438800007078_prdsasgridn03

不过,会有前 20 名的结果。我想在第三个命令中用作输入的部分是上面粗体显示的文件夹名称,这是我需要进入第三个命令的内容,因此第三个命令将如下所示:

ls -la|  grep SAS_work438800007078_prdsasgridn03

此命令输出将为我提供用户 ID。我想对从运行的第二个命令的输出生成的每个文件夹名称运行此命令。

添加更准确的示例

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_prdsasgrid n04/SAS_work154B00007B7E_prdsasgridn04 165G/saswork/SAS_workBD3300007B7E_prdsasgridn04 134G/saswork/SAS_work36E800005097_prdsasgridn04/SAS_workA86000005097_prdsasgridn04 134 G /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_work8268 00003AAF_prdsasgridn03 57G /saswork/SAS_work3FB700003AAF_prdsasgridn03 55G/saswork/SAS_work8744000068D9_prdsasgridn01/SAS_work8CA9000068D9_prdsasgridn01 55G /saswork/SAS_work87440000 68D9_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.

答案1

要将命令的结果保存在变量中,您只需将命令括在 `` 或 $() 之间:

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

请记住,该命令是一个粗略的示例,可能需要对其进行调整以避免重复(因为如果您的目录有子目录,则同一父目录将有不同的输出)。

答案2

如果我正确理解您的问题,您希望查看最大目录的所有者列表(按降序排列)。换句话说:

  1. 您想根据目录的大小对目录进行排序
  2. 查找前 20 个最大目录中每个目录的用户 ID。

如果您想查看格式的输出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

如您所见,这为您提供了所有目录的排序列表(基于大小)文件。但您只对目录/文件夹及其大小和用户 ID 感兴趣。因此,如果您向所有这些(上面的命令)添加一个简单的管道并使用该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 个最大的目录。

所有信用转到 Stack Overflow 用户塞比。请参阅 SO 上的此线程以获取更多信息:使用 ls 列出目录及其总大小

相关内容