xargs-管道命令符

琉璃2年前技术文章829

有时候我们的脚本却需要 echo '516' | kill 这样的效果,例如 ps -ef | grep 'ddd' | kill 这样的效果,筛选出符合某条件的进程pid然后结束。这种需求对于我们来说是理所当然而且是很常见的,那么应该怎样达到这样的效果呢。有几个解决办法:

  1. 通过

kill `ps -ef | grep 'ddd'`#这种形式,这个时候实际上等同于拼接字符串得到的命令,其效果类似于  kill $pid
  1. for循环遍历

for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done#其实与第一种原理一样,只不过需要多次kill的时候是循环处理的,每次处理一个
  1. xargs

ps -ef | grep 'ddd' | xargs kill#xargs命令可以通过管道接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数


1、xargs 参数

1.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

1.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   ==>执行结果


1.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个参数,最后还剩一个,就直接传递一个参数。

1.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其搜索结果的每一条字符串后面实际上是加了换行

相关文章

Elasticsearch如何使用内存

ES作为一个JAVA程序,其对内存的使用和管理依赖底层JVM。因而设置内存时需要遵从JAVA的普适原则,如-xmx和-xms设置为相同值等。在JVM的基础上,ES对内存的使用可按功能分为以下几大部分:...

Elasticsearch8.5及Kibana8.5安装部署

Elasticsearch8.5及Kibana8.5安装部署

一、环境准备1、Centos7系统2、切换英文系统[root@master02 ~]# tail -n2 /etc/profile export LANG="en_US.UTF-8"3、下载、安...

Kubernetes安全--securityContext介绍

securityContext是用来控制容器内的用户权限,你想用什么用户去执行程序或者执行操作等等。1. securityContext介绍安全上下文(Security Context)定义 Pod...

SparkStreaming对接kafka消费模式区别

SparkStreaming对接kafka消费模式区别

Sparkstreaming对接kafka使用的消费方式与常规的kafka消费方式完全不同,其中区别主要为消费者的管理方式不同。Ø  常规消费模式Kafka常规的消费模式以消费者组为消费单元...

Go 配置文件管理(ini)

Go 配置文件管理(ini)

1、背景ini 文件是 Initialization File 的缩写,即初始化文件,可用于统一管理各项配置。gopkg.in/ini.v1 是地表最强大、最方便和最流行的 Go 语言 INI 文件操...

数仓主流架构简介之二

数仓主流架构简介之二

一、流批一体数据批流一体是一种云计算架构模式,它结合了批处理和流处理的特点,以实现更高效、灵活和可扩展的数据处理能力。在这种模式下,数据可以同时进行批处理和流处理,以满足不同场景下的需求流批一体:是指...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。