1 join命令
join file1 file2 #内连接:将两个文件中每列第一个字符相同的行合并(忽略不匹配的行)
join -a1 file1 file2 #显示左边文件中的所有记录(右边文件中没有匹配的不显示)
join -a2 file1 file2 #显示右边文件中的所有记录(左边文件中没有匹配的不显示)
join -a1 -a2 file1 file2 #全连接(显示左边和右边所有记录)
-o:指定输出字段
join -o 1.1 file1 file2 #指定输出第一个文件的第一个字段
指定输出多个字段:
join -o 1.1 2.2 file1 file2 #指定输出第一个文件的第一个字段和第二个文件的第二个字段
-t:指定分隔符
join -t ':' file3 file4 #以:为分隔符连接
-v 1:不匹配的行输出
join -v 1 -a1 -a2 file1 file2
2 tr命令
tr,translate的简写,这里用到的意思是转化,转变,转换。
参数 | 说明 |
---|---|
-c -C | 字符串替换,要求字符集为ASCII |
-d | 删除字符 |
-s | 删除所有重复出现字符序列,只保留第一个(即将重复出现字符压缩为一个字符串) |
-t | 删除第一字符集较第二字符集多出的字符 |
参数 | 说明 |
---|---|
[:digit:] | 所有数字 |
[:graph:] | 所有可打印字符,不包括空格 |
[:lower:] | 所有小写字符 |
[:upper:] | 所有大写字符 |
[:print:] | 所有可打印字符,包括空格 |
[:punct:] | 所有标点字符 |
[:space:] | 所有横向或纵向的空白 |
echo "HELLO BLACK MAMBA" | tr "A-Z" "a-z" #将大写字母转换成小写字母
echo 12345 | tr '0-9' '987654321' #将0-9的正常输出,转换为9-1的倒序,即1-8,2-7,3-6,4-5,5-4,6-3,7-2,8-1,9-0 所以这里的12345输出后就会变成87654
echo 87654 | tr '987654321' '0-9' #将刚刚设置的倒序,再转换为正常的0-9输出
echo 'hello 123 world 456' | tr -d '0-9' #删除其中的数字
echo 'hello 123 world 456' | tr -d -c '0-9\n' #表示不再'0-9'集合内的内容全删除
echo " 1 2 333333 h e " | tr -s ' ' #表示使用空格来压缩文本内容,也可以说是用空格来调整文本的格式
echo westos | tr '[:lower:]' '[:upper:]' #这里同样可以使用之前讲过的通配符号
3 xargs命令
- xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具;
- xargs可以将管道或标准输入数据转换成命令行参数,也能够从文件的输出中读取数据;
- xargs也可以将单行或多行文本输入转换为其他格式(多行变单行,单行变多行);
- xargs默认的命令是echo,这以为这通过管道传递给xargs的输入将会包含换行和空白,不过通过 xargs的处理,换行和空白将被空格取代.
find /sbin -perm /0700 | xargs ls -l #它能够捕捉一个命令的输出,然后传递给另外一个命令,由于很多命令不支持|管道来传递参数,而日常工作中有这个必要,所以就有了xargs命令
cat test.txt | xargs #对格式混乱的文本进行规范
cat test.txt | xargs -n3 #指定文本每行4个字符输出
echo "nameXnameXnameXname" | xargs -dX #删除字符X
echo "nameXnameXnameXname" | xargs -dX -n2 #删除字符X,并且指定每行2个字符输出
echo "one two three" | xargs mkdir #将输入的数据,变换成命令mkdir的参数,创建one two three三个目录
echo "one two three" | xargs -p touch #将输入的数据,变换成命令touch的参数,创建one two three三个文件,-p询问是否执行指定动作,输入yes才能够执行,即才会生成三个文件
echo "one two three" | xargs -t rm #-t不询问 直接执行指定动作,即删除one two three这三个文件
find /etc/ -type f -print0 | xargs -0 ls
cat tests | xargs -I name sh -c 'echo name;mkdir name' #-I表示输入多个命令,表示将文本中的内容转换成命令的参数,这里的name就表示tests中的文件内容,这个可以随便命名