Linux脚本攻略学习笔记之 xargs以及tr实例演示

一、xargs

xargs (exatend argments) 可以将标准输入数据转换成命令行参数。xargs也可以将单行或多行文本输入转换成其他格式。bash 用户都爱单行命令,单行命令是一个命令序列,各命令之间不使用分号,而是使用管道操作符进行联接。xargs 命令应该紧跟在管道操作符之后,以标准输入作为主要的源数据流。它使用stdin 并通过提供命令行参数来执行其他命令。之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数。

1.1、将多行输入转换成单行输出。

将换行符移除,再用 " "(空格)进行替换。
有如下文本:

cat  example.txt

在这里插入图片描述

cat  example.txt | xargs 

将上面文档转换为一行,结果如下:

在这里插入图片描述

1.2将单行输入转换成多行输出

指定每行最大的参数数量 n 然后将任何来自stdin的文本划分成多行。 空格是默认的定界符。

cat example.txt | xargs  -n 3

将文本转换为每行最多三个字符的输出
在这里插入图片描述

1.3、-d 选项指定定制的定界符

xargs 默认的定界符是空格或者是换行符
指定定界符为’,’

echo "天苍苍,野茫茫,风吹草低见牛羊"  | xargs   -d \,

在这里插入图片描述

结合-n

echo "天苍苍,野茫茫,风吹草低见牛羊"  | xargs   -d \, -n 2

在这里插入图片描述

1.4、读取stdin,将格式化参数传递给命令

创建如下脚本,脚本作用打印传入脚本的参数
在这里插入图片描述
储存参数的文本如下
在这里插入图片描述

先需要 执行脚本xargs.sh时传入args.txt中的参数,这里执行脚本时就不支持从stdin中读取数据。

1.4.1、每次只传入一个参数

cat  args.txt | xargs -n 1  ./xargs.sh

在这里插入图片描述

1.4.2、一次传入所有参数

cat args.txt | xargs  ./xargs.sh

在这里插入图片描述

1.5、-I 为特定的命令(xargs.sh)提供命令行参数。

再来看如下命令 arg1是唯一可变内容,如何实现从args.txt 中读取 实现如下功能。

./xargs.sh -p arg1 -l
xargs 有一个选项 -I 可以指定替换字符串
先来看如下结果

cat args.txt | xargs -I {}  ./xargs.sh -p {} -l

在这里插入图片描述

-I 指定了替换字符串 ,对于每一个命令参数 ,字符串{}(这里还可以指定其他合法的字符串, 执行脚本中的{}都会被从stdin读取到的参数替换掉。
注意这里的{}也可以是其他的合法字符串,如指定为replace ,结果跟上面一样
在这里插入图片描述

**注意:**这里 -I 也是使用循环方式执行的,这里有三个命令参数,就会循环替换三次

1.6、xargs与find组合

1.6.1、错误的组合方式

find . - type f -name  "*.txt" -print  | xargs rm -rf

这样做很危险。因为没有办法预测分隔find命令输出结果的定界符是什么(’\n’或者’ ‘),因此xarg是很可能会误认为它们是定界符 (如: hell text.txt 会被xargs误解为 hell 和text.txt)
只要我们把find 输出作为xargs的输入,就必须将 -print0 与find 结合使用,以字符null(’\0’)来分隔输出

1.6.2、正确的组合方式

find   . -type f -name "*.txt"  -print0 | xargs -0 rm -f 
  xargs  -0 将 \0 作为输入定界符.

这样就可以删除所有的txt文件

1.6 3、结合stdin运用while语句和子shell

cat  all_files_txt.txt | (while read arg;do cat $arg;done)

#等同于 cat  all_files_txt.txt | xargs -I {} cat {}

在这里插入图片描述
while 循环中,cat $arg 替换成任意数量的命令。

子shell 操作符内部的多个命令可以作为一个整体来运行。

cmd0 | (cmd1;cmd2;cmd3;) |cmd4

如果cmd1是cd/ 那么就会改变子shell 的工作目录,然而这种改变仅限于子shell内部。 cmd4 则完全不知道工作目录发生了变化

二、tr

tr 是Unix命令行专家工具箱中一件简约却不失精美的工具。它经常用来编写优美的单行命
令,作用不容小视。 tr 可以对来自标准输入的内容进行字符替换、字符删除以及重复字符压缩。
它可以将一组字符变成另一组字符,因而通常也被称为转换(translate)命令。

2.1 语法

语法:
tr [options] set1 set2
tr 只能通过stdin(标准输入),而无法通过命令行参数来接受输入。
作用:将来自stdin 的输入字符从set1 映射到set2,然后将输出写入stdout。set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么 set2 会不断重复其最后一个字符,直到长度与 set1 相同。如果 set2 的长度大于 set1 ,那么在 set2 中超出 set1 长度的那部分字符则全部被忽略。

2.2 实例

"HELLO WHO IS THIS 转换为小写

echo  "HELLO WHO IS THIS " |  tr 'A-Z' 'a-z'

在这里插入图片描述

‘ABD-}’ 、 ‘aA.,’ 、 ‘a-ce-x’ 以及 ‘a-c0-9’ 等均是合法的集合。
定义集合也很简单、只需要使用 “起始字符-终止字符”。如果不是一个连续的字符序列,那它就会被视为包含了三个元素的集合。 也就是 起始字符,- 终止字符。

2.3加密、解密实例

#加密 876543

echo 123456 | tr '0-9' '9876543210'

在这里插入图片描述

#解密

echo  876543 | tr '9876543210' '0-9'

在这里插入图片描述

2.4、ROT13算法演示

加密:
echo “tr came,tr saw,tr conquered.” | tr ‘a-zA-Z’ ‘n-za-mN-ZA-M’

得到输出ge pnzr,ge fnj, ge pbadhrerq.

在这里插入图片描述
解密:

echo  "ge pnzr,ge fnj, ge pbadhrerq." | 'n-za-mN-ZA-M'  tr 'a-zA-Z'

2.5、 tr还可以用来将制表符转换成空格

tr  '\t'  ' '

2.6、删除字符

-d
语法 cat file.txt | tr -d ‘[set1]’
#只使用set1 ,不使用set2
下图实例删除 字符串 Hello 123 world 456 中的数字

echo  "Hello 123 world 456 " | tr -d '0-9'

在这里插入图片描述

2.7、字符集补集

c 选项
语法 tr -c [set1] [set2]
set1的补集意味着这个集合中包含set1中没有的所有字符

echo hello 1 char 2 next | tr -d -c '0-9 \n'
#补集 -c '0-9 \n' 表示除数字空格、换行符之外的所有字符
#-d 删除,即删除除数字空格、换行符之外的所有字符

在这里插入图片描述

2.8、压缩字符

s 选项 压缩字符
下面删除 "Hello world "多余的空格

echo "Hello   world  " | tr -s ' '

在这里插入图片描述

删除多余的换行符
文本如下
在这里插入图片描述

    cat mutil_line.txt  | tr -s  '\n'

结果如下:
在这里插入图片描述

2.9 字符类

tr 可以像使用集合一样使用各种不同的字符类,这些字符类如下所示:
 alnum :字母和数字。
 alpha :字母。
 cntrl :控制(非打印)字符。
 digit :数字。
 graph :图形字符。
 lower :小写字母。
 print :可打印字符。
 punct :标点符号。
 space :空白字符。
 upper :大写字母。
 xdigit :十六进制字符

可以按照下面的方式选择并使用所需的字符类:
tr [:class:] [:class:]
例如:
tr ‘[:lower:]’ ‘[:upper:]’

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的中年程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值