Shell-Script
使用 awk 和 find 進行多文件重定向
我在一個目錄中有一些文件。我想在文件的頂部和末尾添加一些行
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
++awk
overwrite withtee
),但它得到錯誤:$ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \; find: missing argument to `-exec'
因此,我如何使用**
awk
命令覆蓋目前目錄中的所有文件**(即:用|tee
或其他東西) ?
使用 GNU
awk
4.1 或更高版本:find . -type f -exec awk ' @load "inplace" BEGINFILE { inplace_begin(FILENAME, "") print "line1\nline2" } {print} ENDFILE { print "line3\nline4" inplace_end(FILENAME, "") }' {} +
決策1 :使用 GNU
sed
而不是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