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,glob就足够了:
    for i in /tmp/files/date*; do
  3. >=应该在子shell之外:
    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"和子shell,不需要引用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. 你不需要 cat 这里:
    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

您可以使用basename获取路径的最后一部分(文件名)

$ basename '/usr/bin/env'
env
于 2012-04-10T17:34:39.173 回答
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 回答