xargs命令詳解,xargs與管道的區別

在工作中經常會接觸到xargs命令,特別是在別人寫的腳本里面也經常會遇到,但是卻很容易與管道搞混淆,本篇會詳細講解到底什么是xargs命令,為什么要用xargs命令以及與管道的區別。為什么要用xargs呢,我們知道,linux命令可以從兩個地方讀取要處理的內容,一個是通過命令行參數,一個是標準輸入。例如cat、grep就是這樣的命令,舉個例子:

1
echo 'main' | cat test.cpp

這種情況下cat會輸出test.cpp的內容,而不是'main'字符串,如果test.cpp不存在則cat命令報告該文件不存在,并不會嘗試從標準輸入中讀取。echo 'main' | 會通過管道將 echo 的標準輸出(也就是字符串'main')導入到 cat 的標準輸入,也就是說此時cat的標準輸入中是有內容的,其內容就是字符串'main'但是上面的內容中cat不會從它的標準輸入中讀入要處理的內容。(注:標準輸入是有一個緩沖區的,就像我們在程序中使用scanf函數從標準輸入中讀取一樣,實際上是從標準輸入的緩沖區中讀取的)。其實基本上linux的命令中很多的命令的設計是先從命令行參數中獲取參數,然后從標準輸入中讀取,反映在程序上,命令行參數是通過main函數 int main(int argc,char*argv[]) 的函數參數獲得的,而標準輸入則是通過標準輸入函數例如C語言中的scanf讀取到的。他們獲取的地方是不一樣的。例如:

1
echo 'main' | cat

這條命令中cat會從其標準輸入中讀取內容并處理,也就是會輸出 'main' 字符串。echo命令將其標準輸出的內容 'main' 通過管道定向到 cat 的標準輸入中。

1
cat

如果僅僅輸入cat并回車,則該程序會等待輸入,我們需要從鍵盤輸入要處理的內容給cat,此時cat也是從標準輸入中得到要處理的內容的,因為我們的cat命令行中也沒有指定要處理的文件名。大多數命令有一個參數? -? 如果直接在命令的最后指定 -? 則表示從標準輸入中讀取,例如:

1
echo 'main' | cat -

這樣也是可行的,會顯示 'main' 字符串,同樣輸入 cat - 直接回車與輸入 cat 直接回車的效果也一樣,但是如果這樣呢:

1
echo 'main' | cat test.cpp -

同時指定test.cpp 和 - 參數,此時cat程序還是會顯示test.cpp的內容。但是有一個程序的策略則不同,它是grep,例如:

1
echo 'main' | grep 'main' test.cpp -

該命令的輸出結果是:
test.cpp:int main()
(standard input):main

此時grep會同時處理標準輸入和文件test.cpp中的內容,也就是說會在標準輸入中搜索 'main' 也會在文件 test.cpp (該文件名從grep命令行參數中獲得)中搜索 'main'。也就是說當命令行中 test.cpp 和 - 兩個參數同時存在的時候,不同的程序處理不同。我們看到了cat與grep處理就不同。但是有一點是一樣的,首先在命令行中查找要處理的內容的來源(是從文件還是從標準輸入,還是都有),如果在命令行中找不到與要處理的內容的來源相關的參數則默認從標準輸入中讀取要處理的內容了。

另外很多程序是不處理標準輸入的,例如 kill , rm 這些程序如果命令行參數中沒有指定要處理的內容則不會默認從標準輸入中讀取。所以:

1
echo '516' | kill

這種命里是不能執行的。

1
echo 'test' | rm -f

這種也是沒有效果的。

這兩個命令只接受命令行參數中指定的處理內容,不從標準輸入中獲取處理內容。想想也很正常,kill 是結束進程,rm是刪除文件,如果要結束的進程pid和要刪除的文件名需要從標準輸入中讀取,這個也很怪異吧。 但是像 cat與grep這些文字處理工具從標準輸入中讀取待處理的內容則很自然。

但是有時候我們的腳本卻需要 echo '516' | kill 這樣的效果,例如 ps -ef | grep 'ddd' | kill 這樣的效果,篩選出符合某條件的進程pid然后結束。這種需求對于我們來說是理所當然而且是很常見的,那么應該怎樣達到這樣的效果呢。有幾個解決辦法:

1. 通過 kill `ps -ef | grep 'ddd'`?? ?
#這種形式,這個時候實際上等同于拼接字符串得到的命令,其效果類似于? kill $pid

2. for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done? ?
#其實與第一種原理一樣,只不過需要多次kill的時候是循環處理的,每次處理一個

3. ps -ef | grep 'ddd' | xargs kill ?
#OK,使用了xargs命令,鋪墊了這么久終于鋪到了主題上。xargs命令可以通過管道接受字符串,并將接收到的字符串通過空格分割成許多參數(默認情況下是通過空格分割) 然后將參數傳遞給其后面的命令,作為后面命令的命令行參數

回到頂部

xargs是什么,與管道有什么不同

xargs與管道有什么不同呢,這是兩個很容易混淆的東西,看了上面的xargs的例子還是有點云里霧里的話,我們來看下面的例子弄清楚為什么需要xargs:

echo '--help' | cat
輸出:
--help

echo '--help' | xargs cat
輸出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output.
??-A, --show-all?????????? equivalent to -vET
??-b, --number-nonblank??? number nonempty output lines
??-e?????????????????????? equivalent to -vE
??-E, --show-ends????????? display $ at end of each line
??-n, --number???????????? number all output lines
??-s, --squeeze-blank????? suppress repeated empty output lines
??-t?????????????????????? equivalent to -vT
??-T, --show-tabs????????? display TAB characters as ^I
??-u?????????????????????? (ignored)
??-v, --show-nonprinting?? use ^ and M- notation, except for LFD and TAB
??????--help???? display this help and exit
??????--version? output version information and exit
With no FILE, or when FILE is -, read standard input.
Examples:
??cat f - g? Output f's contents, then standard input, then g's contents.
??cat??????? Copy standard input to standard output.
Report cat bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
For complete documentation, run: info coreutils 'cat invocation'

可以看到 echo '--help' | cat?? 該命令輸出的是echo的內容,也就是說將echo的內容當作cat處理的文件內容了,實際上就是echo命令的輸出通過管道定向到cat的輸入了。然后cat從其標準輸入中讀取待處理的文本內容。這等價于在test.txt文件中有一行字符 '--help' 然后運行? cat test.txt 的效果。

而 echo '--help' | xargs cat 等價于 cat --help 什么意思呢,就是xargs將其接受的字符串 --help 做成cat的一個命令參數來運行cat命令,同樣? echo 'test.c test.cpp' | xargs cat 等價于 cat test.c test.cpp 此時會將test.c和test.cpp的內容都顯示出來。

回到頂部

xargs的一些有用的選項

信到這里應該都知道xargs的作用了,那么我們看看xargs還有一些有用的選項:

1. -d 選項
默認情況下xargs將其標準輸入中的內容以空白(包括空格、Tab、回車換行等)分割成多個之后當作命令行參數傳遞給其后面的命令,并運行之,我們可以使用 -d 命令指定分隔符,例如:
echo '11@22@33' | xargs echo
輸出:
11@22@33
默認情況下以空白分割,那么11@22@33這個字符串中沒有空白,所以實際上等價于 echo 11@22@33 其中字符串 '11@22@33' 被當作echo命令的一個命令行參數

echo '11@22@33' | xargs -d '@' echo
輸出:
11 22 33
指定以@符號分割參數,所以等價于 echo 11 22 33 相當于給echo傳遞了3個參數,分別是11、22、33

2. -p 選項
使用該選項之后xargs并不會馬上執行其后面的命令,而是輸出即將要執行的完整的命令(包括命令以及傳遞給命令的命令行參數),詢問是否執行,輸入 y 才繼續執行,否則不執行。這種方式可以清楚的看到執行的命令是什么樣子,也就是xargs傳遞給命令的參數是什么,例如:
echo '11@22@33' | xargs -p -d '@'? echo
輸出:
echo 11 22 33
??...y????? ==>這里詢問是否執行命令 echo 11 22 33 輸入y并回車,則顯示執行結果,否則不執行
?11 22 33?? ==>執行結果

3. -n 選項
該選項表示將xargs生成的命令行參數,每次傳遞幾個參數給其后面的命令執行,例如如果xargs從標準輸入中讀入內容,然后以分隔符分割之后生成的命令行參數有10個,使用 -n 3 之后表示一次傳遞給xargs后面的命令是3個參數,因為一共有10個參數,所以要執行4次,才能將參數用完。例如:

echo '11@22@33@44@55@66@77@88@99@00' | xargs -d '@' -n 3 echo
輸出結果:
11 22 33
44 55 66
77 88 99
00
等價于:
echo 11 22 33
echo 44 55 66
echo 77 88 99
echo 00
實際上運行了4次,每次傳遞3個參數,最后還剩一個,就直接傳遞一個參數。

4. -E 選項,有的系統的xargs版本可能是-e? eof-str
該選項指定一個字符串,當xargs解析出多個命令行參數的時候,如果搜索到-e指定的命令行參數,則只會將-e指定的命令行參數之前的參數(不包括-e指定的這個參數)傳遞給xargs后面的命令
echo '11 22 33' | xargs -E '33' echo
輸出:
11 22

可以看到正常情況下有3個命令行參數 11、22、33 由于使用了-E '33' 表示在將命令行參數 33 之前的參數傳遞給執行的命令,33本身不傳遞。等價于 echo 11 22 這里-E實際上有搜索的作用,表示只取xargs讀到的命令行參數前面的某些部分給命令執行。

注意:-E只有在xargs不指定-d的時候有效,如果指定了-d則不起作用,而不管-d指定的是什么字符,空格也不行。

echo '11 22 33' | xargs -d ' ' -E '33' echo? => 輸出 11 22 33
echo '11@22@33@44@55@66@77@88@99@00 aa 33 bb' | xargs -E '33' -d '@' -p? echo? => 輸出 11 22 33 44 55 66 77 88 99 00 aa 33 bb

## -0 選項表示以 '\0' 為分隔符,一般與find結合使用

find . -name "*.txt"
輸出:
./2.txt
./3.txt
./1.txt???? => 默認情況下find的輸出結果是每條記錄后面加上換行,也就是每條記錄是一個新行

find . -name "*.txt" -print0
輸出:
./2.txt./3.txt./1.txt???? => 加上 -print0 參數表示find輸出的每條結果后面加上 '\0' 而不是換行

find . -name "*.txt" -print0 | xargs -0 echo
輸出:
./2.txt ./3.txt ./1.txt

find . -name "*.txt" -print0 | xargs -d '\0' echo
輸出:
./2.txt ./3.txt ./1.txt

xargs的 -0 和 -d '\0' 表示其從標準輸入中讀取的內容使用 '\0' 來分割,由于 find 的結果是使用 '\0' 分隔的,所以xargs使用 '\0' 將 find的結果分隔之后得到3個參數: ./2.txt ./3.txt ./1.txt? 注意中間是有空格的。上面的結果就等價于 echo ./2.txt ./3.txt ./1.txt

實際上使用xargs默認的空白分隔符也是可以的? find . -name "*.txt"? | xargs? echo?? 因為換行符也是xargs的默認空白符的一種。find命令如果不加-print0其搜索結果的每一條字符串后面實際上是加了換行

轉載于:https://www.cnblogs.com/tunian/p/9924085.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388045.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pytorch回歸_PyTorch:用嶺回歸檢查泰坦尼克號下沉

pytorch回歸In this notebook, we shall use this dataset containing data about passengers from the Titanic. Based on this data, we will use a Ridge Regression model which just means a Logistic Regression model that uses L2 Regularization for predicting wheth…

Java后臺與VUE跨域交接

后臺代碼&#xff1a;package com.cn.Mr.Zhong.filter;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;impor…

koa2 中使用 svg-captcha 生成驗證碼

1. 安裝svg-captcha $ npm install --save svg-captcha 2. 使用方法 生成有4個字符的圖片和字符串const svgCaptcha require(svg-captcha)const cap svgCaptcha.create({size: 4, // 驗證碼長度width:160,height:60,fontSize: 50,ignoreChars: 0oO1ilI, // 驗證碼字符中排除 …

Weblogic 節點啟動

1.啟動管理理節點export JAVA_OPTIONS"$JAVA_OPTIONS -Dcom.sun.xml.namespace.QName.useCompatibleSerialVersionUID1.0 -Djava.security.egdfile:/dev/./urandom"nohup ./startWebLogic.sh >admin.log &tail -f admin.log2.啟動節點ssonohup ./startManaged…

[Swift]LeetCode74. 搜索二維矩陣 | Search a 2D Matrix

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

iris數據集 測試集_IRIS數據集的探索性數據分析

iris數據集 測試集Let’s explore one of the simplest datasets, The IRIS Dataset which basically is a data about three species of a Flower type in form of its sepal length, sepal width, petal length, and petal width. The data set consists of 50 samples from …

Oracle 12c 安裝 Linuxx86_64

1)下載Oracle Database 12cRelease 1安裝介質 官方的下載地址&#xff1a; 1&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2&#xff1a;https://edelivery.oracle.com/EPD/Download/get_form?egroup_aru_number16496…

Linux入門實驗

學習Linux要先做實驗來熟悉操作系統本次先寫點入門的操作。 關于Linux入門實驗的操作如下&#xff1a; 【例1】顯示當前使用的shell [rootcentos7 ~]# echo ${SHELL} /bin/bash 【例2】顯示當前系統使用的所有shell [rootcentos7 ~]#cat /etc/shells /bin/sh /bin/bash /usr/bi…

flink 檢查點_Flink檢查點和恢復

flink 檢查點Apache Flink is a popular real-time data processing framework. It’s gaining more and more popularity thanks to its low-latency processing at extremely high throughput in a fault-tolerant manner.Apache Flink是一種流行的實時數據處理框架。 它以容…

917. 僅僅反轉字母

給定一個字符串 S&#xff0c;返回 “反轉后的” 字符串&#xff0c;其中不是字母的字符都保留在原地&#xff0c;而所有字母的位置發生反轉。 示例 1&#xff1a; 輸入&#xff1a;"ab-cd" 輸出&#xff1a;"dc-ba"示例 2&#xff1a; 輸入&#xff1a;&q…

C# socket nat 映射 網絡 代理 轉發

using System;using System.Collections.Generic;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace portmap_net{/// <summary>/// 映射器實例狀態/// </summary>sealed internal class state{#region Fields (5)pu…

python初學者_初學者使用Python的完整介紹

python初學者A magical art of teaching a computer to perform a task is called computer programming. Programming is one of the most valuable skills to have in this competitive world of computers. We, as modern humans, are living with lots of gadgets such as …

c# nat udp轉發

UdpClient myClient;Thread recvThread;//打開udp端口開始接收private void startRecv(int port){myClient new UdpClient(port);recvThread new Thread(new ThreadStart(receive));recvThread.Start();}//停止接收private void stopRecv(){recvThread.Abort();}private void…

【Code-Snippet】TextView

1. TextView文字過長&#xff0c;顯示省略號 【參考】 必須要同時設置XML和JAVA&#xff0c;而且&#xff0c;java中設置文字必須是在最后。 android:ellipsize"start|end|middle" //省略號的位置 android:singleLine"true" android:lines"2"…

Object 的靜態方法之 defineProperties 以及數據劫持效果

再提一下什么是靜態方法&#xff1a; 靜態方法&#xff1a;在類身上的方法&#xff0c;  動態方法:在實例身上的方法 Object.defineProperties(obj, props)obj&#xff1a;被添加屬性的對象props&#xff1a;添加或更新的屬性對象給對象定義屬性&#xff0c;如果存在該屬性&a…

Spring實現AOP的4種方式

Spring實現AOP的4種方式 先了解AOP的相關術語: 1.通知(Advice): 通知定義了切面是什么以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。 2.連接點(Joinpoint): 程序能夠應用通知的一個“時機”&#xff0c;這些“時機”就是連接點&#xff0c;例如方法被調用時、…

如何使用Plotly在Python中為任何DataFrame繪制地圖的衛星視圖

Chart-Studio和Mapbox簡介 (Introduction to Chart-Studio and Mapbox) Folium and Geemap are arguably the best GIS libraries/tools to plot satellite-view maps or any other kinds out there, but at times they require an additional authorization to use the Google…

Java入門系列-26-JDBC

認識 JDBC JDBC (Java DataBase Connectivity) 是 Java 數據庫連接技術的簡稱&#xff0c;用于連接常用數據庫。 Sun 公司提供了 JDBC API &#xff0c;供程序員調用接口和類&#xff0c;集成在 java.sql 和 javax.sql 包中。 Sun 公司還提供了 DriverManager 類用來管理各種不…

3.19PMP試題每日一題

在房屋建造過程中&#xff0c;應該先完成衛生管道工程&#xff0c;才能進行電氣工程施工&#xff0c;這是一個&#xff1a;A、強制性依賴關系B、選擇性依賴關系C、外部依賴關系D、內部依賴關系 作者&#xff1a;Tracy19890201&#xff08;同微信號&#xff09;轉載于:https://…

Can't find temporary directory:internal error

今天我機子上的SVN突然沒有辦法進行代碼提交了&#xff0c;出現的錯誤提示信息為&#xff1a; Error&#xff1a;Cant find temporary directory:internal error 然后試了下其他的SVN源&#xff0c;發現均無法提交&#xff0c;并且update時也出現上面的錯誤信息。對比項目文件…