Shell-Script

使用 awk 和 find 進行多文件重定向

  • January 20, 2015

我在一個目錄中有一些文件。我想在文件的頂部和末尾添加一些行awk

範例:我的awk命令:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file

通過使用上面的命令,我可以在&的頂部添加line1& ,在末尾line2``line3``line4``file

現在我想對目前目錄中存在的所有文件執行相同的操作。

如果我使用:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' *

然後我在終端螢幕上得到輸出,但我無法重定向到(或覆蓋)所有文件

所以,我嘗試了以下(To find+ awk):

find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' \;

通過使用上述命令,我可以在螢幕上列印輸出,從而覆蓋文件

我試過以下(To find++ awkoverwrite with tee),但它得到錯誤:

$ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \;
find: missing argument to `-exec'

因此,我如何使用**awk命令覆蓋目前目錄中的所有文件**(即:用|tee或其他東西) ?

使用 GNU awk4.1 或更高版本:

find . -type f -exec awk '
  @load "inplace"
  BEGINFILE {
    inplace_begin(FILENAME, "")
    print "line1\nline2"
  }
  {print}
  ENDFILE {
    print "line3\nline4"
    inplace_end(FILENAME, "")
  }' {} +

決策1 :使用 GNUsed而不是awk

sed -i -e '1 i\line1\nline2' -e '$ a\line3\nline4' ./* 

決策2:對目錄中的每個文件使用循環

for file in ./*
do
 awk '
      BEGIN { print "line1\nline2" }
      { print $0 }
      END { print "line3\nline4" }
     ' "$file" > "$file".tmp &&
   mv -f "$file".tmp "$file"
done

引用自:https://unix.stackexchange.com/questions/180066