linux 命令值xargs与tr
管道符 | 允许将一个命令的输出作为另一个命令的输入。然而,管道符在处理某些类型的输入时存在局限性,特别是当需要将一系列输入项作为单个命令的多个参数时()。
xargs 的出现正是为了解决这个问题。xargs 能够从标准输入(stdin)读取数据,并将这些数据转换为特定命令的参数列表。这使得 xargs 在处理大量输入项时非常有用,特别是当这些输入项需要作为单个命令的多个参数时。
以下是一些 xargs 相对于管道符 | 的优势:
-
参数构建:
xargs可以将多个输入项组合成一个参数列表,然后一次性传递给命令。这对于需要处理大量文件或数据的场景特别有用。 -
处理复杂输入:
xargs提供了多种选项来处理复杂的输入,比如指定分隔符(-d)、限制每次命令运行的参数个数(-n)以及使用自定义的占位符(-I)。 -
安全性:在处理包含空格、换行符等特殊字符的文件名时,
xargs的-0选项可以与find命令的-print0选项结合使用,以确保正确处理这些特殊字符。 -
灵活性:
xargs可以与其他命令和工具结合使用,以构建复杂的命令行管道。例如,你可以将find命令的输出通过管道传递给xargs,然后使用xargs来执行rm命令删除找到的文件。
tr命令
tr 主要用于替换或删除文件中的字符。tr 命令通过从标准输入读取数据,然后对其进行处理,并将结果输出到标准输出(通常是屏幕,但也可以重定向到文件)。
常用选项
-c或--complement:取字符集的补集,即处理不在指定字符集中的字符。-d或--delete:删除指定字符集中的字符。-s或--squeeze-repeats:将连续的重复字符压缩为一个。-t或--truncate-set1:将SET1截断为与SET2相同的长度。
tr [OPTION]... SET1 [SET2]SET1:指定要转换或删除的字符集合。
SET2:指定用于替换 SET1 中字符的字符集合(如果提供)。如果 SET2 的长度小于 SET1,则 SET2 会被重复以匹配 SET1 的长度。如果 SET2 未提供,则 SET1 中的字符会被删除。
示例
- 将小写字母转换为大写字母:
echo "hello world" | tr 'a-z' 'A-Z'
- 删除文件中的数字:
echo "abc123def456" | tr -d '0-9'
- 将连续的空格压缩为一个空格:
echo "This is a test." | tr -s ' '
- 使用补集删除所有非字母字符:
echo "Hello, World! 123" | tr -cd 'a-zA-Z'
输出:
HelloWorld
综合示例
echo "file1,txt:file2,txt:file3,txt" | tr ':,' '\n' | xargs -n 2 ls -l
输出结果
ls: cannot access 'file1.txt': No such file or directory ls: cannot access 'file2.txt': No such file or directory ls: cannot access 'file3.txt': No such file or directory
拆解
echo "file1,txt:file2,txt:file3,txt" | tr ':,' '\n'file1.txt
file2.txt
file3.txt
-
| tr ':,' '\n'管道符号
|将echo命令的输出作为tr命令的输入。tr命令是一个字符转换工具,这里它被用来将输入字符串中的:和,替换为换行符\n。注意,虽然这里指定了两个要替换的字符(:和,),但只给出了一个替换字符(\n),这意味着:和,都会被替换为\n。因此,每个文件名(及其后面的,txt部分)都会被放在新的一行上。
示例2
echo "file1.txt:file2.txt,file3.txt;file4.txt" | tr ':,;' '\n' |xargs ls -l ls: cannot access 'file1.txt': No such file or directory ls: cannot access 'file2.txt': No such file or directory ls: cannot access 'file3.txt': No such file or directory ls: cannot access 'file4.txt': No such file or directory

浙公网安备 33010602011771号