検索
ホームページ運用・保守Linuxの運用と保守Linux での xargs コマンドの詳細な説明と xargs とパイプの違い

問題の原因である xargs を使用する理由

xargs コマンドは仕事上、特に他の人が書いたスクリプトでよく触れるのですが、パイプラインとは混同されやすいので、この記事で詳しく説明します。 xargs コマンド、xargs コマンドを使用する理由とパイプとの違い。なぜ xargs を使用するのでしょうか? linux コマンドは 2 つの場所から処理対象のコンテンツを読み取ることができることがわかっています。1 つはコマンド ライン パラメーター経由で、もう 1 つは標準入力です。たとえば、cat と grep はそのようなコマンドです。 例:

echo 'main' | cat test.cpp

この場合、cat は 'main'string の代わりに test.cpp の内容を出力します。報告してください ファイルは存在しないため、標準入力からの読み取りは試行されません。 echo 'main' | は、echo の標準出力 (つまり、文字列 'main') をパイプ経由で cat の標準入力にインポートします。つまり、現時点では cat の標準入力に内容があり、その内容は文字列です。 ' main' ですが、上記のコンテンツでは、cat は処理対象のコンテンツを標準入力から読み取りません。 (注: 標準入力にはバッファーがあります。プログラム内で標準入力から読み取るために scanf 関数 を使用するのと同じように、実際には標準入力バッファーから読み取ります)。実際、多くの Linux コマンドは、基本的に最初にコマンド ライン パラメーターからパラメーターを取得し、次に標準入力からそれらを読み取るように設計されており、コマンド ライン パラメーターは int main(int argc,char を介してプログラムに反映されます)。 main関数*argv[])関数パラメータを取得し、C言語のscanfなどの標準入力関数を通じて標準入力を読み込みます。どこで手に入れるかは異なります。例:

echo 'main' | cat

このコマンドにより、cat は標準入力からコンテンツを読み取って処理します。つまり、「main」文字列を出力します。 echo コマンドは、標準出力「main」の内容をパイプを通じて cat の標準出力に送信します。

cat

cat と入力して Enter を押すと、プログラムはキーボードから処理する内容を cat に入力する必要があります。このとき、cat は標準入力からも処理する内容を取得します。なぜなら、cat コマンドの行には処理するファイル名も指定されていないからです。ほとんどのコマンドにはパラメーターがあります - コマンドの最後に直接指定されている場合、それは標準入力から読み取ることを意味します。

例:

echo 'main' | cat -

これも実行可能です。「main」文字列が表示され、cat も入力します - Enter を押すと、cat を入力するのと同じ効果が得られます。しかし、次の場合は次のようになります。

echo 'main' | cat test.cpp -

test.cpp と - パラメータを同時に指定すると、cat プログラムは test.cpp の内容を表示します。しかし、別の戦略を持つプログラムがあり、それは grep です。例:

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

このコマンドの出力は次のとおりです:

test.cpp:int main()
(standard input):main

この時点で、grep は標準入力とファイル test.cpp の内容を処理します。これは、標準入力で「main」を検索すると、ファイル test.cpp でも「main」が検索されることを意味します (ファイル名は grep コマンド ライン引数から取得されます)。つまり、test.cpp と - の 2 つのパラメータがコマンド ラインに同時に存在する場合、プログラムによってそれらの処理は異なります。 cat と grep の処理方法が異なることがわかりました。ただし、同じことが 1 つあります。処理対象のコンテンツのソースに関連するパラメータが見つからない場合は、まずコマンド ラインで処理対象のコンテンツのソースを (ファイル、標準入力、またはその両方から) 検索します。コマンドライン内 デフォルトでは、処理されるコンテンツは標準の 入力から読み取られます。

さらに、kill や rm などの多くのプログラムは標準入力を処理しません。コマンド ライン パラメーターで処理対象が指定されていない場合、これらのプログラムはデフォルトで標準入力から読み取りません。だから:

echo '516' | kill

このような運命は実行できません。

りー

これも効果なし。

これら2つのコマンドはコマンドラインパラメータで指定された処理内容のみを受け付け、標準入力から処理内容を取得することはありません。考えてみれば普通のことですが、kill はプロセスを終了することを意味し、rm はファイルを削除することを意味します。終了するプロセスの pid と削除するファイルの名前を標準入力から読み取る必要がある場合、これも変です。 しかし、cat や grep などのワードプロセッサ ツールが標準入力から処理対象のコンテンツを読み取るのは自然なことです。

ただし、スクリプトでは、特定の条件を満たすプロセス pid を除外して終了するために、 ps -ef | grep 'ddd' | などの echo '516' | kill の効果が必要になることがあります。このニーズは私たちにとって自然であり、非常に一般的なものですが、この効果を達成するにはどうすればよいでしょうか?いくつかの解決策があります: 1.

echo 'test' | rm -f

の形式を通じて、この時間は実際には文字列を結合することによって得られるコマンドと同等であり、その効果は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

输出:

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

可以看到 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 のデフォルトの空白文字の 1 つであるため、 xargs find . -name "*.txt" | xargs echo のデフォルトの空白区切り文字を使用することもできます。 find コマンドで -print0 が追加されない場合、実際には検索結果の各文字列の後に改行が追加されます。

以上がLinux での xargs コマンドの詳細な説明と xargs とパイプの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Linux:メンテナンスモードの入力と終了Linux:メンテナンスモードの入力と終了May 02, 2025 am 12:01 AM

Linuxメンテナンスモードに入る方法には次のものがあります。1。grub構成ファイルを編集し、「シングル」または「1」パラメーターを追加し、Grub構成を更新します。 2。GRUBメニューでスタートアップパラメーターを編集し、「シングル」または「1」を追加します。終了メンテナンスモードでは、システムを再起動する必要があります。これらの手順を使用すると、必要に応じてメンテナンスモードをすばやく入力して安全に終了し、システムの安定性とセキュリティを確保できます。

Linuxの理解:定義されたコアコンポーネントLinuxの理解:定義されたコアコンポーネントMay 01, 2025 am 12:19 AM

Linuxのコアコ​​ンポーネントには、カーネル、シェル、ファイルシステム、プロセス管理、メモリ管理が含まれます。 1)カーネル管理システムリソース、2)シェルはユーザーインタラクションインターフェイスを提供します。3)ファイルシステムは複数の形式をサポートします。4)プロセス管理は、フォークなどのシステムコールを通じて実装され、5)メモリ管理は仮想メモリテクノロジーを使用します。

Linuxの構成要素:主要なコンポーネントが説明しましたLinuxの構成要素:主要なコンポーネントが説明しましたApr 30, 2025 am 12:26 AM

Linuxシステムのコアコンポーネントには、カーネル、ファイルシステム、ユーザースペースが含まれます。 1.カーネルはハードウェアリソースを管理し、基本的なサービスを提供します。 2。ファイルシステムは、データストレージと組織を担当します。 3.ユーザースペースでユーザープログラムとサービスを実行します。

メンテナンスモードの使用:Linuxのトラブルシューティングと修復メンテナンスモードの使用:Linuxのトラブルシューティングと修復Apr 29, 2025 am 12:28 AM

メンテナンスモードは、シングルユーザーモードまたはレスキューモードを介してLinuxシステムに入力される特別な動作レベルであり、システムのメンテナンスと修理に使用されます。 1.メンテナンスモードを入力し、コマンド「sudosystemctlisolaterscue.target」を使用します。 2。メンテナンスモードでは、ファイルシステムを確認して修復し、コマンド「FSCK/DEV/SDA1」を使用できます。 3.高度な使用法には、ルートユーザーパスワードのリセット、ファイルシステムの読み取りモードと書き込みモードのマウント、パスワードファイルの編集が含まれます。

Linuxメンテナンスモード:目的の理解Linuxメンテナンスモード:目的の理解Apr 28, 2025 am 12:01 AM

メンテナンスモードは、システムのメンテナンスと修理に使用され、管理者が簡素化された環境で作業できるようにします。 1。システム修理:破損したファイルシステムとブートローダーを修理します。 2。パスワードリセット:ルートユーザーパスワードをリセットします。 3。パッケージ管理:ソフトウェアパッケージをインストール、更新、または削除します。 GRUB構成を変更するか、特定のキーを使用してメンテナンスモードを入力することにより、メンテナンスタスクを実行した後、安全に終了できます。

Linux操作:ネットワーキングとネットワーク構成Linux操作:ネットワーキングとネットワーク構成Apr 27, 2025 am 12:09 AM

Linuxネットワークの構成は、次の手順で完了できます。1。ネットワークインターフェイスを構成し、IPコマンドを使用して、構成ファイルの永続性設定を一時的に設定または編集します。 2。固定IPを必要とするデバイスに適した静的IPを設定します。 3.ファイアウォールを管理し、iPtablesまたはFirewalldツールを使用してネットワークトラフィックを制御します。

Linuxのメンテナンスモード:システム管理者ガイドLinuxのメンテナンスモード:システム管理者ガイドApr 26, 2025 am 12:20 AM

メンテナンスモードは、Linuxシステム管理において重要な役割を果たし、修復、アップグレード、構成の変更を支援します。 1.メンテナンスモードを入力します。 Grubメニューから選択するか、コマンド「sudosystemctlisolaterscue.target」を使用できます。 2。メンテナンスモードでは、ファイルシステムの修理およびシステムの更新操作を実行できます。 3.高度な使用法には、ルートパスワードのリセットなどのタスクが含まれます。 4.メンテナンスモードに入ったり、ファイルシステムをマウントできないなどの一般的なエラーは、GRUB構成をチェックしてFSCKコマンドを使用して固定できます。

Linuxのメンテナンスモード:それを使用する時期と理由Linuxのメンテナンスモード:それを使用する時期と理由Apr 25, 2025 am 12:15 AM

Linuxメンテナンスモードを使用するタイミングと理由:1)システムが起動するとき、2)主要なシステムの更新またはアップグレードを実行するとき、3)ファイルシステムメンテナンスを実行するとき。メンテナンスモードは、安全で制御された環境を提供し、運用上の安全性と効率を確保し、ユーザーへの影響を減らし、システムセキュリティを強化します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター