Проверьте, существует ли файл и содержит ли он определенную строку - PullRequest
32 голосов
/ 22 сентября 2010

Я хочу проверить, существует ли file2.sh, а также, если определенное слово, poet является частью файла.Я использую grep для создания переменной used_var.

#!/bin/ksh

file_name=/home/file2.sh                  
used_var=`grep "poet" $file_name`    

Как я могу проверить, имеет ли used_var какое-либо значение?

Ответы [ 5 ]

46 голосов
/ 22 сентября 2010

Вместо того, чтобы сохранять выходные данные grep в переменной и затем проверять, является ли переменная пустой, вы можете сделать это:

if grep -q "poet" $file_name
then
    echo "poet was found in $file_name"
fi

============

Вот некоторые часто используемые тесты:

   -d FILE
          FILE exists and is a directory
   -e FILE
          FILE exists
   -f FILE
          FILE exists and is a regular file
   -h FILE
          FILE exists and is a symbolic link (same as -L)
   -r FILE
          FILE exists and is readable
   -s FILE
          FILE exists and has a size greater than zero
   -w FILE
          FILE exists and is writable
   -x FILE
          FILE exists and is executable
   -z STRING
          the length of STRING is zero

Пример:

if [ -e "$file_name" ] && [ ! -z "$used_var" ]
then
    echo "$file_name exists and $used_var is not empty"
fi
14 голосов
/ 22 сентября 2010
if test -e "$file_name";then
 ...
fi

if grep -q "poet" $file_name; then
  ..
fi
6 голосов
/ 22 сентября 2010

test -e проверит, существует файл или нет. Команда test возвращает нулевое значение, если проверка прошла успешно, или 1 в противном случае.

Тест можно записать как test -e или используя []

[ -e "$file_name" ] && grep "poet" $file_name

Если вам на самом деле не нужен вывод grep, вы можете проверить возвращаемое значение, так как grep вернет 1, если совпадений нет, и ноль, если они есть.

В общих чертах вы можете проверить, не является ли строка непустой, используя [ "string" ], который вернет 0, если не пусто, и 1, если пусто

4 голосов
/ 22 сентября 2010

Если у вас установлен двоичный файл test или ksh имеет соответствующую встроенную функцию, вы можете использовать ее для выполнения проверок.Обычно /bin/[ является символической ссылкой на test:

if [ -e "$file_name" ]; then
  echo "File exists"
fi

if [ -z "$used_var" ]; then
  echo "Variable is empty"
fi
1 голос
/ 12 января 2014

Вы должны использовать флаг grep -q для тихого вывода. Смотрите справочные страницы ниже:

вывод man grep:

 General Output Control

  -q, --quiet, --silent
              Quiet;  do  not write anything to standard output.  Exit immediately with zero status
              if any match is  found,  even  if  an  error  was  detected.   Also  see  the  -s  or
              --no-messages option.  (-q is specified by POSIX.)

Этот скрипт KornShell (ksh) демонстрирует тихий вывод grep и является решением вашего вопроса.

grepUtil.ksh:

#!/bin/ksh

#Initialize Variables
file=poet.txt
var=""
dir=tempDir
dirPath="/"${dir}"/"
searchString="poet"

#Function to initialize variables
initialize(){
    echo "Entering initialize"
    echo "Exiting initialize"
}

#Function to create File with Input
#Params: 1}Directory 2}File 3}String to write to FileName
createFileWithInput(){
    echo "Entering createFileWithInput"
    orgDirectory=${PWD}
    cd ${1}
    > ${2}
    print ${3} >> ${2}
    cd ${orgDirectory}
    echo "Exiting createFileWithInput"
}

#Function to create File with Input
#Params: 1}directoryName
createDir(){
    echo "Entering createDir"
    mkdir -p ${1}
    echo "Exiting createDir"
}

#Params: 1}FileName
readLine(){
    echo "Entering readLine"
    file=${1}
    while read line
    do
        #assign last line to var
        var="$line"
    done <"$file"
    echo "Exiting readLine"
}
#Check if file exists 
#Params: 1}File
doesFileExit(){
    echo "Entering doesFileExit"
    orgDirectory=${PWD}
    cd ${PWD}${dirPath}
    #echo ${PWD}
    if [[ -e "${1}" ]]; then
        echo "${1} exists"
    else
        echo "${1} does not exist"
    fi
    cd ${orgDirectory}
    echo "Exiting doesFileExit"
}
#Check if file contains a string quietly
#Params: 1}Directory Path 2}File 3}String to seach for in File
doesFileContainStringQuiet(){
    echo "Entering doesFileContainStringQuiet"
    orgDirectory=${PWD}
    cd ${PWD}${1}
    #echo ${PWD}
    grep -q ${3} ${2}
    if [ ${?} -eq 0 ];then
        echo "${3} found in ${2}"
    else
        echo "${3} not found in ${2}"
    fi
    cd ${orgDirectory}
    echo "Exiting doesFileContainStringQuiet"
}
#Check if file contains a string with output
#Params: 1}Directory Path 2}File 3}String to seach for in File
doesFileContainString(){
    echo "Entering doesFileContainString"
    orgDirectory=${PWD}
    cd ${PWD}${1}
    #echo ${PWD}
    grep ${3} ${2}
    if [ ${?} -eq 0 ];then
        echo "${3} found in ${2}"
    else
        echo "${3} not found in ${2}"
    fi
    cd ${orgDirectory}
    echo "Exiting doesFileContainString"
}

#-----------
#---Main----
#-----------
echo "Starting: ${PWD}/${0} with Input Parameters: {1: ${1} {2: ${2} {3: ${3}"
#initialize #function call#
createDir ${dir} #function call#
createFileWithInput ${dir} ${file} ${searchString} #function call#
doesFileExit ${file} #function call#
if [ ${?} -eq 0 ];then
    doesFileContainStringQuiet ${dirPath} ${file} ${searchString} #function call#
    doesFileContainString ${dirPath} ${file} ${searchString} #function call#
fi
echo "Exiting: ${PWD}/${0}"

grepUtil.ksh Вывод:

user@foo /tmp
$ ksh grepUtil.ksh
Starting: /tmp/grepUtil.ksh with Input Parameters: {1:  {2:  {3:
Entering createDir
Exiting createDir
Entering createFileWithInput
Exiting createFileWithInput
Entering doesFileExit
poet.txt exists
Exiting doesFileExit
Entering doesFileContainStringQuiet
poet found in poet.txt
Exiting doesFileContainStringQuiet
Entering doesFileContainString
poet
poet found in poet.txt
Exiting doesFileContainString
Exiting: /tmp/grepUtil.ksh
...