使用文件的第一列作为脚本中的输入

时间:2015-08-07 18:15:24

标签: bash unix scripting

我在使用第一列$ {1}作为脚本输入时遇到了一些问题。

目前,脚本的部分内容如下所示。

#!/bin/bash

INPUT="${1}"
for NAME in `cat ${INPUT}`
do
    SIZE="`du -sm /FAServer/na3250-a/homes/${NAME} | sed 's|/FAServer/na3250-a/homes/||'`"
    DATESTAMP=`ls -ld /FAServer/na3250-a/homes/${NAME} | awk '{print $6}'`
echo "${SIZE} ${DATESTAMP}"
done

但是,我想修改INPUT =“$ {1}”以获取特定文件中的第一个{1}。这样我就可以在另一个脚本中运行上面的行,并使用以前生成的文件作为输入。还要将输出发送到新文件。

类似于:

INPUT="$location/DisabledActiveHome ${1}"   ???

以下是我的完整脚本。

#!/bin/bash
# This script will search through Disabled Users OU and compare that list of
# names against the current active Home directories. This is to find out
# how much space those Home directories take up and which need to be removed.

# MUST BE RUN AS SUDO!

# Setting variables for _adm and storage path.

echo "Please provide your _adm account name:"
read _adm
echo "Please state where you want the files to be generated: (absolute path)"
read location

# String of commands to lookup information using ldapsearch

ldapsearch -x -LLL -h "REDACTED" -D $_adm@"REDACTED" -W -b "OU=Accounts,OU=Disabled_Objects,DC="XX",DC="XX",DC="XX"" "cn=*" | grep 'sAMAccountName'| egrep -v '_adm$' | cut -d' ' -f2 > $location/DisabledHome

# Get a list of all the active Home directories

ls /FAServer/na3250-a/homes > $location/ActiveHome

# Compare the Disabled accounts against Active Home directories

grep -o -f $location/DisabledHome $location/ActiveHome > $location/DisabledActiveHome

# Now get the size and datestamp for the disabled folders

INPUT="${1}"
for NAME in `cat ${INPUT}`
do
    SIZE="`du -sm /FAServer/na3250-a/homes/${NAME} | sed 's|/FAServer/na3250-a/homes/||'`"
    DATESTAMP=`ls -ld /FAServer/na3250-a/homes/${NAME} | awk '{print $6}'`
echo "${SIZE} ${DATESTAMP}"
done

我是所有这一切的新手所以欢迎任何帮助。我很乐意澄清您可能遇到的任何问题。

编辑:多一点解释,因为我对这些事情很可怕。

下面的代码行来自前一个脚本是一个FOR循环:

INPUT="${1}"
    for NAME in `cat ${INPUT}`
    do
        SIZE="`du -sm /FAServer/na3250-a/homes/${NAME} | sed 's|/FAServer/na3250-a/homes/||'`"
        DATESTAMP=`ls -ld /FAServer/na3250-a/homes/${NAME} | awk '{print $6}'`
    echo "${SIZE} ${DATESTAMP}"
    done

通过输入以下内容执行:

./Script ./file 

正在引用的FILE有一列用户名而没有其他数据:

User1
User2
User3
etc.

脚本将获取文件并查看第一个用户名,该名称由

引用
INPUT=${1}

然后对该用户运行DU命令,并找出他们的HOME驱动器的大小。这将由SIZE变量报告。对于为用户创建HOME驱动器的时间,它将对DATESTAMP执行相同的操作。完成为该用户完成任务后,它将继续执行列中的下一个任务,直到完成为止。

因此,遵循这一逻辑,我希望自动化整个过程。我不是分两步完成这一步,而是将这一切都做到了一步。

第一个过程是生成$ location / DisabledActiveHome文件,该文件将包含所有已禁用的用户名。然后运行最后一部分以获取DisabledActiveHome文件中所有用户的每个HOME驱动器的大小和创建日期。

所以要做到这一点,我需要修改

INPUT=${1}

行以反映先前生成的文件。

$location/DisabledActiveHome

2 个答案:

答案 0 :(得分:0)

我真的不明白你的问题,但我想你想要这个。假设您的文件名为file.txt,如下所示:

1 99
2 98
3 97
4 96

您可以像这样获得第一列:

awk '{print $1}' file.txt
1
2
3
4

如果要在脚本中使用它,请执行此操作

while read NAME; do  
   echo $NAME
done < <(awk '{print $1}' file.txt)
1
2
3
4

或者您可能更喜欢这样cut

while read NAME; do  
  echo $NAME
done < <(cut -d" " -f1 file.txt)
1
2
3
4

或者这可能更适合

while read NAME OtherUnwantedJunk; do
   echo $NAME
done < file.txt
1
2
3
4

上面最后一个也许是最好的解决方案使用了IFS bash的输入字段分隔符,所以如果您的文件看起来像这样

1:99
2:98
3:97
4:96

你会这样做

while IFS=":" read NAME OtherUnwantedJunk; do
   echo $NAME
done < file.txt
1
2
3
4

答案 1 :(得分:0)

INPUT="$location/DisabledActiveHome"就像一个魅力。我对语法和正确的用法和输出感到困惑

相关问题