web-dev-qa-db-ja.com

文字列がBashのファイルに存在するかどうかをテストするにはどうすればいいですか?

ディレクトリ名を含むファイルがあります。

my_list.txt

/tmp
/var/tmp

その名前がす​​でにファイルに存在する場合は、追加する前にBashをチェックインしたいです。

283
Toren
grep -Fxq "$FILENAME" my_list.txt

名前が見つかった場合は終了ステータスは0(true)、見つからなかった場合は1(false)です。

if grep -Fxq "$FILENAME" my_list.txt
then
    # code if found
else
    # code if not found
fi

これは の関連セクションですgrep - /のマニュアルページ:

grep [options] PATTERN [FILE...]

-F, --fixed-strings
       Interpret PATTERN as a list of fixed strings, separated by  new-
       lines, any of which is to be matched.

-x, --line-regexp
       Select only those matches that exactly match the whole line.

-q, --quiet, --silent
       Quiet; do not write anything to standard output.  Exit  immedi-
       ately  with  zero status if any match is found, even if an error
       was detected.  Also see the -s or --no-messages option.
553
Thomas

次の解決策について

grep -Fxq "$FILENAME" my_list.txt

-Fxqが平易な英語で何を意味するのか(私がやったように)疑問に思っているなら:

  • F:PATTERNの解釈方法に影響します(正規表現の代わりに固定文字列)
  • x:行全体に一致
  • q:Shhhhh ...最小限の印刷

Manファイルから:

-F, --fixed-strings
    Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of which is to be matched.
    (-F is specified by POSIX.)
-x, --line-regexp
    Select only those matches that exactly match the whole line.  (-x is specified by POSIX.)
-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.)
83
Kuf

私の頭の中で3つの方法:

1)パス内の名前のショートテスト(これがあなたのケースかもしれないとは思いません)

ls -a "path" | grep "name"


2)ファイル内の文字列のショートテスト

grep -R "string" "filepath"


3)regexを使った長いbashスクリプト

#!/bin/bash

declare file="content.txt"
declare regex="\s+string\s+"

declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
    then
        echo "found"
    else
        echo "not found"
fi

exit

これは より速い あなたが - を持っているなら ファイル上の複数の文字列をテストするために ループを使用して/例えば任意のcicleで正規表現を変更することを使用します.

34
Luca Borrione

もっと簡単な方法:

if grep "$filename" my_list.txt > /dev/null
then
   ... found
else
   ... not found
fi

ヒント:コマンドの終了ステータスが欲しいが出力はしたくない場合は/dev/nullに送ってください。

15
imwilsonxu

最も簡単で簡単な方法は次のとおりです。

isInFile=$(cat file.txt | grep -c "string")


if [ $isInFile -eq 0 ]; then
   #string not contained in file
else
   #string is in file at least once
fi

grep -cは、ファイル内で文字列が何回出現したかのカウントを返します。

7
Christian737

私があなたの質問を正しく理解したならば、これはあなたが必要とすることをするべきです。

  1. $ check変数で追加したいディレクトリを指定できます
  2. ディレクトリがすでにリストに含まれている場合、出力は「dir already listing」です。
  3. ディレクトリがまだリストに含まれていない場合は、my_list.txtに追加されます。

一行で check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt

5
lecodesportif

Fgrepを使った私のバージョン

  FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
  if [ $FOUND -eq 0 ]; then
    echo "Not able to find"
  else
    echo "able to find"     
  fi  
2
Rudy
grep -E "(string)" /path/to/file || echo "no match found"

-Eオプションはgrepに正規表現を使わせる

2
David Okwii

1行の存在だけを確認したい場合は、ファイルを作成する必要はありません。例えば。、

if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
  # code for if it exists
else
  # code for if it does not exist
fi  
2
gordon

Grep-lessソリューションは、私のために働きます:

MY_LIST=$( cat /path/to/my_list.txt )



if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
  echo "It's there!"
else
echo "its not there"
fi

に基づいて: https://stackoverflow.com/a/229606/3306354

0
AndrewD
grep -Fxq "String to be found" | ls -a
  • grepはコンテンツの確認に役立ちます
  • lsはすべてのファイルをリストします
0
Shinoy Shaji