2012-04-10 40 views
0

如何根據unix或linux中的sed,grep或awk獲取unix目錄中文件的名稱?如何根據unix或linux中的grep,sed或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 

我需要它來搜索所有文件的某個目錄(只在它們各自的第一行),然後返回哪些文件具有在串他們。

感謝, 添

+1

不解析'ls':HTTP://mywiki.wooledge。org/ParsingLs – 2012-04-10 17:36:44

+0

不要使用'ls',glob本身就足夠了(並且不會像'ls'那樣容易出現空白/醜陋的字符問題)。 – Kevin 2012-04-10 17:37:00

回答

6

您可以簡化您的腳本一點點,得到期望的結果:

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

+1。我會添加'-q'選項來grep並引用'「$ i」'。 – 2012-04-10 17:37:11

+0

@glennjackman:是的,你完全正確。 – bmk 2012-04-10 17:42:31

+0

謝謝!!!這正是我所期待的。 – cyberboxster 2012-04-13 16:58:38

0

您可以使用basename獲得路徑的最後部分(文件名)

$ basename '/usr/bin/env' 
env 
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

所以:

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

取決於你要與列表中做什麼,你可能需要去了解它以不同的方式(find,可能)。

+0

你的結果腳本違反了你的觀點#1。 ;-) – 2012-04-11 15:32:30

+0

@DennisWilliamson哎呀。修正了,謝謝你的發現。 – Kevin 2012-04-11 15:38:37

0

「我需要它搜索某個目錄中的所有文件(每個文件只有它們的第一行),然後返回哪些文件中包含該字符串。」

發現,grep的的組合,削減

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 : 
相關問題