0

unix または linux の sed、grep、または awk に基づいて、unix のディレクトリ内のファイルの名前を取得するにはどうすればよいですか?

私は次のようなことができると思いました:

    for i in $(ls /tmp/files/date*); do
       if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then
          echo $i
       fi
    done

特定のディレクトリ内のすべてのファイル (それぞれの最初の行のみ) を検索し、どのファイルに文字列が含まれているかを返す必要があります。

ありがとう、ティム

4

4 に答える 4

6

スクリプトを少し単純化して、目的の結果を得ることができます。

for i in /tmp/files/date*; do
   if head -n 1 "$i" | grep -q "6"; then
      basename "$i"
   fi
done
于 2012-04-10T17:35:27.217 に答える
2

コードには多くの問題があります。重要度の高い順に、多かれ少なかれそれらを見ていきます。

  1. あなたが行方不明ですthen
    if [ $(cat $i | head -n 1 | grep -c "6" >= 1) ] ; then
  2. 解析しないでくださいls。グロブで十分です。
    for i in /tmp/files/date*; do
  3. サブシェルの>=外側にある必要があります:
    if [ $(cat $i | head -n 1 | grep -c "6") >= 1 ] ; then
  4. 数値的に比較する必要>=があります:-ge
    if [ $(cat $i | head -n 1 | grep -c "6") -ge 1 ] ; then
  5. 引用"$i"とサブシェル、6を引用する必要はありません:
    if [ "$(cat "$i" | head -n 1 | grep -c 6)" -ge 1 ] ; then
  6. の戻り値をgrep使用して、を制御できます(静かにしたいので、カウントする必要がないため、にif切り替えます。-c-q
    if cat "$i" | head -n 1 | grep -q 6 ; then
  7. ここでは猫は必要ありません:
    if head -n 1 "$i" | grep -q 6 ; then

それで:

for i in /tmp/files/date*; do
   if head -n 1 "$i" | grep -q 6 ; then
      echo $i
   fi
done

リストで何をするかによって、別の方法でやりたいと思うかもしれません(findおそらく)。

于 2012-04-10T17:59:10.077 に答える
0

「特定のディレクトリ内のすべてのファイル(それぞれの最初の行のみ)を検索してから、文字列が含まれているファイルを返すために必要です。」

find、grep、cutの組み合わせ

find a_certain_directory_name -exec \grep -n -H -m 1 my_search_string {} \; | cut -f 1,2 -d : | grep -e ":1\$" | cut -f 1 -d :
于 2012-04-11T19:27:30.203 に答える
0

basenameパスの最後の部分 (ファイル名) を取得するために使用できます。

$ basename '/usr/bin/env'
env
于 2012-04-10T17:34:39.173 に答える