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