찾다
운영 및 유지보수리눅스 운영 및 유지 관리Linux의 xargs 명령에 대한 자세한 설명과 xargs와 파이프의 차이점

문제의 원인인 xargs를 사용하는 이유

직장에서 특히 다른 사람이 작성한 스크립트에서 xargs 명령을 자주 접하게 되는데, 파이프라인과 혼동하기 쉽습니다. 이 기사에서는 이에 대해 자세히 설명합니다. xargs 명령, xargs 명령을 사용해야 하는 이유와 파이프와의 차이점. xargs를 사용하는 이유는 무엇입니까? linux 명령은 명령줄 매개변수와 표준 입력을 통해 두 곳에서 처리할 콘텐츠를 읽을 수 있다는 것을 알고 있습니다. 예를 들어 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) *argv[]) 함수 매개변수를 얻고 C 언어에서 scanf와 같은 표준 입력 함수를 통해 표준 입력을 읽습니다. 얻는 곳이 다릅니다. 예:

echo 'main' | cat

이 명령은 cat이 표준 입력에서 내용을 읽고 처리하도록 합니다. 즉, 'main' 문자열을 출력합니다. echo 명령은 표준 출력 'main'의 내용을 파이프를 통해 cat의 표준 출력으로 보냅니다.

cat

그냥 cat을 입력하고 Enter를 누르면 프로그램은 입력을 기다리게 됩니다. 이때 cat은 처리할 내용을 키보드에서 입력받아야 합니다. , 왜냐하면 우리의 cat 명령에는 해당 줄에 지정된 처리할 파일 이름도 없기 때문입니다. 대부분의 명령에는 매개변수가 있습니다. 명령 끝에 직접 지정하는 경우 이는 표준 입력에서 읽는 것을 의미합니다.

예:

echo 'main' | cat -

이것도 가능합니다. 'main' 문자열이 표시되며 cat을 입력해도 됩니다. 직접 return 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와 -라는 두 매개변수가 명령줄에 동시에 존재할 경우 서로 다른 프로그램에서 이를 다르게 처리합니다. 우리는 cat과 grep이 다르게 처리되는 것을 보았습니다. 그러나 한 가지는 동일합니다. 처리할 콘텐츠의 소스와 관련된 매개변수를 찾을 수 없는 경우 먼저 명령줄(파일, 표준 입력 또는 둘 다에서)에서 처리할 콘텐츠의 소스를 찾습니다. 명령줄에서 기본적으로 처리할 콘텐츠는 표준 입력에서 읽혀집니다.

또한 많은 프로그램은 kill 및 rm과 같은 표준 입력을 처리하지 않습니다. 명령줄 매개변수가 처리할 내용을 지정하지 않으면 이러한 프로그램은 기본적으로 표준 입력에서 읽지 않습니다. 그래서:

echo '516' | kill

이런 운명은 이루어질 수 없습니다.

echo 'test' | rm -f

이것도 효과가 없습니다.

이 두 명령은 명령줄 매개변수에 지정된 처리 내용만 허용하고 표준 입력에서 처리 내용을 가져오지 않습니다. 생각해보면 당연한 일인데 Kill은 프로세스를 종료한다는 뜻이고 rm은 파일을 삭제한다는 뜻이다. 이것도 이상해요. 그러나 cat 및 grep과 같은 워드 프로세싱 도구가 표준 입력에서 처리할 콘텐츠를 읽는 것은 자연스러운 일입니다.

그러나 때로는 특정 조건을 충족하는 프로세스 pid를 필터링하고 종료하기 위해 스크립트에 ps -ef | grep 'ddd' | kill과 같은 효과가 필요합니다. 이러한 요구는 우리에게 자연스럽고 매우 흔한 일입니다. 그렇다면 이 효과를 어떻게 달성해야 할까요? 여러 가지 해결책이 있습니다: 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

输出:

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의 기본 공백 문자 중 하나이기 때문에 xargs find .-name "*.txt" | xargs echo의 기본 공백 구분 기호를 사용할 수도 있습니다. find 명령이 -print0을 추가하지 않으면 실제로 검색 결과의 각 문자열 뒤에 줄바꿈이 추가됩니다.

위 내용은 Linux의 xargs 명령에 대한 자세한 설명과 xargs와 파이프의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Linux : 복구 모드에 들어가는 방법 (및 유지 보수)Linux : 복구 모드에 들어가는 방법 (및 유지 보수)Apr 18, 2025 am 12:05 AM

Linux 복구 모드를 입력하는 단계는 다음과 같습니다. 1. 시스템을 다시 시작하고 특정 키를 눌러 Grub 메뉴를 입력하십시오. 2. (복구 계)로 옵션을 선택하십시오. 3. FSCK 또는 루트와 같은 복구 모드 메뉴에서 작업을 선택하십시오. 복구 모드를 사용하면 단일 사용자 모드에서 시스템을 시작하고 파일 시스템 검사 및 수리를 수행하고 구성 파일 편집 및 기타 작업을 수행하여 시스템 문제를 해결할 수 있습니다.

Linux의 필수 구성 요소 : 초보자를위한 설명Linux의 필수 구성 요소 : 초보자를위한 설명Apr 17, 2025 am 12:08 AM

Linux의 핵심 구성 요소에는 커널, 파일 시스템, 쉘 및 공통 도구가 포함됩니다. 1. 커널은 하드웨어 리소스를 관리하고 기본 서비스를 제공합니다. 2. 파일 시스템은 데이터를 구성하고 저장합니다. 3. Shell은 사용자가 시스템과 상호 작용할 수있는 인터페이스입니다. 4. 일반적인 도구는 일상적인 작업을 완료하는 데 도움이됩니다.

Linux : 기본 구조를 살펴 봅니다Linux : 기본 구조를 살펴 봅니다Apr 16, 2025 am 12:01 AM

Linux의 기본 구조에는 커널, 파일 시스템 및 쉘이 포함됩니다. 1) 커널 관리 하드웨어 리소스 및 UNAME-R을 사용하여 버전을보십시오. 2) Ext4 파일 시스템은 큰 파일과 로그를 지원하며 mkfs.ext4를 사용하여 생성됩니다. 3) Shell은 Bash와 같은 명령 줄 상호 작용을 제공하고 LS-L을 사용하는 파일을 나열합니다.

Linux 운영 : 시스템 관리 및 유지 보수Linux 운영 : 시스템 관리 및 유지 보수Apr 15, 2025 am 12:10 AM

Linux 시스템 관리 및 유지 보수의 주요 단계에는 다음이 포함됩니다. 1) 파일 시스템 구조 및 사용자 관리와 같은 기본 지식을 마스터합니다. 2) 시스템 모니터링 및 리소스 관리를 수행하고 Top, HTOP 및 기타 도구를 사용하십시오. 3) 시스템 로그를 사용하여 문제를 해결하고 JournalCTL 및 기타 도구를 사용하십시오. 4) 자동 스크립트 및 작업 스케줄링을 작성하고 CRON 도구를 사용하십시오. 5) 보안 관리 및 보호 구현, iptables를 통해 방화벽을 구성합니다. 6) 성능 최적화 및 모범 사례를 수행하고 커널 매개 변수를 조정하며 좋은 습관을 개발하십시오.

Linux의 유지 관리 모드 이해 : 필수 요소Linux의 유지 관리 모드 이해 : 필수 요소Apr 14, 2025 am 12:04 AM

시작시 init =/bin/bash 또는 단일 매개 변수를 추가하여 Linux 유지 관리 모드가 입력됩니다. 1. 유지 보수 모드를 입력하십시오 : 그루브 메뉴를 편집하고 시작 매개 변수를 추가하십시오. 2. 파일 시스템을 다시 마운트하여 읽고 쓰기 모드 : MOUNT-OREMOUNT, RW/. 3. 파일 시스템 수리 : FSCK/DEV/SDA1과 같은 FSCK 명령을 사용하십시오. 4. 데이터 손실을 피하기 위해 데이터를 백업하고주의해서 작동합니다.

Debian이 Hadoop 데이터 처리 속도를 향상시키는 방법Debian이 Hadoop 데이터 처리 속도를 향상시키는 방법Apr 13, 2025 am 11:54 AM

이 기사에서는 데비안 시스템에서 Hadoop 데이터 처리 효율성을 향상시키는 방법에 대해 설명합니다. 최적화 전략에는 하드웨어 업그레이드, 운영 체제 매개 변수 조정, Hadoop 구성 수정 및 효율적인 알고리즘 및 도구 사용이 포함됩니다. 1. 하드웨어 리소스 강화는 모든 노드에 일관된 하드웨어 구성, 특히 CPU, 메모리 및 네트워크 장비 성능에주의를 기울일 수 있도록합니다. 전반적인 처리 속도를 향상시키기 위해서는 고성능 하드웨어 구성 요소를 선택하는 것이 필수적입니다. 2. 운영 체제 조정 파일 설명 자 및 네트워크 연결 : /etc/security/limits.conf 파일을 수정하여 파일 설명자의 상한을 늘리고 동시에 시스템에 의해 열 수 있습니다. JVM 매개 변수 조정 : Hadoop-env.sh 파일에서 조정

데비안 syslog를 배우는 방법데비안 syslog를 배우는 방법Apr 13, 2025 am 11:51 AM

이 안내서는 데비안 시스템에서 syslog를 사용하는 방법을 배우도록 안내합니다. Syslog는 로깅 시스템 및 응용 프로그램 로그 메시지를위한 Linux 시스템의 핵심 서비스입니다. 관리자가 시스템 활동을 모니터링하고 분석하여 문제를 신속하게 식별하고 해결하는 데 도움이됩니다. 1. syslog에 대한 기본 지식 syslog의 핵심 기능에는 다음이 포함됩니다. 로그 메시지 중앙 수집 및 관리; 다중 로그 출력 형식 및 대상 위치 (예 : 파일 또는 네트워크) 지원; 실시간 로그보기 및 필터링 기능 제공. 2. Syslog 설치 및 구성 (RSYSLOG 사용) Debian 시스템은 기본적으로 RSYSLOG를 사용합니다. 다음 명령으로 설치할 수 있습니다 : sudoaptupdatesud

데비안에서 Hadoop 버전을 선택하는 방법데비안에서 Hadoop 버전을 선택하는 방법Apr 13, 2025 am 11:48 AM

데비안 시스템에 적합한 Hadoop 버전을 선택할 때는 다음과 같은 주요 요소를 고려해야합니다. 1. 안정성 및 장기 지원 : 안정성과 보안을 추구하는 사용자의 경우 Debian11 (Bullseye)과 같은 데비안 안정 버전을 선택하는 것이 좋습니다. 이 버전은 완전히 테스트되었으며 최대 5 년의 지원주기가있어 시스템의 안정적인 작동을 보장 할 수 있습니다. 2. 패키지 업데이트 속도 : 최신 Hadoop 기능 및 기능을 사용해야하는 경우 Debian의 불안정한 버전 (SID)을 고려할 수 있습니다. 그러나 불안정한 버전에는 호환성 문제와 안정성 위험이있을 수 있습니다. 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기