在 Linux 上將一個命令的輸出作為另一個命令的引數
介紹
在使用 Linux 命令列時,我們經常使用多個命令,這些命令將重要資料作為引數。在本教程中,我們將探討如何將一個命令的輸出作為另一個命令的引數的各種場景。我們將建立一個環境來測試我們的策略,並使用示例來說明每個場景。
準備示例檔案
首先,我們需要建立一個名為“dir_example”的目錄和另一個名為“target”的目錄。這些目錄將用於儲存本教程中用作示例的檔案。
$ mkdir dir_example target
接下來,我們將建立兩組檔案,一組大小為10 位元組,另一組大小為 4 位元組。
$ truncate -s 10 dir_example/file{1..3}.this
$ truncate -s 4 dir_example/file{1..2}.not
我們使用truncate命令建立這些檔案。這些檔案被命名為“file1.this”、“file2.this”等,字尾為“.this”,以區別於另一組檔案。這些檔案將用作本教程中的示例。
使用內建的 Read 命令
一些 shell(如Bash和Zsh)有一個名為 read 的內建命令,它讀取輸入的內容並將其儲存在一個變數中。在以下示例中,我們將從“Dir_Example”資料夾複製大小大於 5 位元組的檔案到目標資料夾 -
$ find dir_example/ -type f -size +5c | while read file; do cp "$file" target/; done
在此示例中,我們使用了 search 命令和“-type f”引數來搜尋常規檔案。“-size +5c”引數用於僅查詢大小大於 5 位元組的檔案。接下來,我們使用 search 命令的輸出來饋送 while 迴圈。內建的 read 然後從輸入中讀取並將第一個單詞分配給 file 變數。最後,使用 file 變數作為cp命令的引數,我們可以將同名檔案複製到目標資料夾。
命令替換
一些 shell 具有名為命令替換的機制,該機制允許命令的輸出替換命令的名稱。在以下示例中,我們將使用此功能將大於 5 位元組的檔案複製到目標資料夾 -
$ cp $(find dir_example/ -type f -size +5c) target/
在這種情況下,我們使用命令替換將原始檔列表作為引數饋送到cp命令。然後,我們將它們複製到最後一個引數中給定的目標資料夾。
程序替換
與前面的場景類似,一些 shell 還有另一種稱為程序替換的機制,它將列表的輸入或輸出繫結到一個FIFO。然後,命令使用此FIFO的名稱。在以下示例中,我們將在awk指令碼中使用此功能來計算兩組檔案的大小 -
awk '{hist[ARGIND]++}
END {
for (i in hist)
printf "%s records in process substitution %s
", hist[i] , i
}' \
<(find dir_example/ -type f -size +5c) \
<(find dir_example/ -type f -size -5c)
在此示例中,我們將最大的檔案和小於 5 位元組的檔案分別列在兩個 FIFO 中。然後,在 awk 指令碼內部,我們格式化輸出以顯示檔案計數。
xargs 命令
xargs是一個強大的工具,它使用標準輸入建立和執行命令列。在下一個示例中,我們將建立一個新的示例檔案,並瞭解我們可以使用xargs命令做什麼 -
$ cat - << __EOF > dir_example/file4.this.xargs This file example will be check by the following line: "choose me" __EOF
在此示例中,我們建立了一個名為file4.this的檔案。接下來,我們將使用xargs命令將內容中包含“choose”一詞的檔案複製到目標資料夾 -
$ find dir_example/ -type f | xargs grep -l "choose" | xargs -I {} cp {} target/
在此示例中,我們使用 find 命令列出dir_example資料夾中的所有檔案。然後,我們使用xargs命令來饋送 grep 命令,該命令在檔案中搜索“choose”一詞。-l選項用於僅顯示包含該單詞的檔案的名稱。因此,我們再次使用xargs來為cp命令提供動力,以將目標資料夾中包含“choose”一詞的檔案複製。
結論
在本教程中,我們探討了在 Linux 中將一個命令的輸出作為另一個命令的引數的幾種方法。我們討論了管道運算子、重定向運算子、反引號、read命令、命令替換、程序替換和xargs命令的使用。透過理解這些不同的方法,您可以將命令連結在一起,並僅使用幾個簡單的命令執行復雜的操作。這可以極大地改善您的工作流程並自動化任務,使您在使用 Linux 命令列時更高效。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP