如何在unix或linux中基于grep,sed或awk获取unix目录中文件的名称?

时间:2012-04-10 17:27:32

标签: linux unix sed awk grep

如何在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 个答案:

答案 0 :(得分:6)

您可以稍微简化脚本并获得所需的结果:

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

答案 1 :(得分:2)

您的代码中存在许多问题。我会按照重要性的顺序或多或少地浏览它们。

  1. 你错过了then
    if [ $(cat $i | head -n 1 | grep -c "6" >= 1) ] ; then
  2. 不解析ls,全局就足够了:
    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. 你这里不需要猫:
    if head -n 1 "$i" | grep -q 6 ; then
  8. 所以:

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

    根据您要对列表执行的操作,您可能希望采用不同的方式(find,可能)。

答案 2 :(得分:0)

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

$ basename '/usr/bin/env'
env

答案 3 :(得分: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 :