四 Linux Shell常用命令(二)[xargs,tr,md5sum,sha1sum,加密]

一 xargs

xargs命令应该紧跟在管道操作符之后它使用标准输入作为主要的数据源,将从 stdin 中读取的数据作为指定命令的参数并执行该命令

#将在一组C语言源码文件中搜索字符串main
ls *.c | xargs grep main

xargs默认会执行echo命令.

工作原理:xargs命令接受来自stdin的输入,将数据解析成单个元素,然后调用指定命令并将这些元素作为该命令的参数.xargs默认使用空白字符分割输入并执行/bin/echo.

              如果文件或目录名中包含空格(甚至是换行)的话,使用空白字符来分割输入就会出现问题,比如My Documents目录就会被解析成两个元素: My 和 Documents ,而这两者均不存在

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

[root@rwwh ~]# cat example.txt 
1 2 3 4 5 6
7 8 9 10
11 12
[root@rwwh ~]# cat example.txt | xargs 
1 2 3 4 5 6 7 8 9 10 11 12

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

#xargs 的 -n 选项可以限制每次调用命令时用到的参数个数
[root@rwwh ~]# cat example.txt |xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12

[root@rwwh ~]# cat example.txt |xargs -n 2
1 2
3 4
5 6
7 8
9 10
11 12

③指定分割参数的分隔符.使用-d选项可以为输入数据指定自定义的分隔符

[root@rwwh ~]# echo "splitXsplit2Xsplit3Xsplit4" | xargs -d X
split split2 split3 split4

[root@rwwh ~]# echo "splitXsplit2Xsplit3Xsplit4" | xargs -d X -n 2
split split2
split3 split4

④find命令和xargs命令结合一起使用

xargs 命令可以同 find 命令很好地结合在一起。 find 的输出可以通过管道传给 xargs, 由后者执行 -exec 选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格, find 命令的
-print0 选项可以使用 0 (NULL)来分隔查找到的元素,然后再用 xargs 对应的 -0 选项进行解析

#在Samba挂载的文件系统中搜索.docx文件,这些文件名中通常会包含大写字母和空格。其中使用了 grep 找出内容中不包含image的文件

 find /smbMount -iname '*.docx' -print0 | xargs -0 grep -L image

#xargs 和 find 可以配合完成任务。不过在结合使用的时候需要留心,这样做很危险,有可能会误删文件。我们无法预测 find 命令输出的分隔符究竟是什么
(究竟是 '\n' 还是 ' ' )。如果有文件名中包含空格符( ' ' ), xargs 会将其误认为是分隔符

例如,bashrc text.txt会被视为bashrc和text.txt。因此上面的命令不会删除bashrc text.txt,而是会把bashrc删除

find . -type f -name "*.txt" -print | xargs rm -f
可以使用find命名的-print0选项生成以空字符('\0')作为分隔符输出,然后将其作为xargs命令的输入
 find . -type f -name "*.txt" -print0 | xargs -0 rm -f

 ⑤读取stdin,为命令传入格式化参数

[root@rwwh rh]# cat ceho.sh 
#!/bin/bash

echo $@'#'

[root@rwwh rh]# cat args.txt 
arg1
arg2
arg3
#限制传入参数的个数
[root@rwwh rh]# cat args.txt | xargs -n 1 ./ceho.sh 
arg1#
arg2#
arg3#

#xargs有一个选项-I,可以用于指定替换字符串,这个字符串会在xargs解析输入时被参数换掉

[root@rwwh rh]# cat args.txt | xargs -I {} ./ceho.sh -p {} -l
-p arg1 -l#
-p arg2 -l#
-p arg3 -l#

注意:使用-I的时候,命令以循环的方式进行,如果有3个参数,那么命令就会连同{}一起被执行3次.{}会在每次执行中被替换为相应的参数.

⑥统计源代码中所有C程序文件的行数

find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc –l

二 tr

  tr命令可以对来自标准输入的内容进行字符替换,字符删除以及重复字符压缩.tr是translate(转换)的简写,因为它可以将一组字符转换成另一组字符

   tr只能通过stdin(标准输入)接收输入(无法通过命令行参数接收),其调用格式如下:

tr [options] set1 set2

  来自stdin的输入字符会按照位置从set1映射到set2(set1中的第一个字符映射到set2中的第一个字符.以此类推),然后将输出写入stdout(标准输出).set1和set2是字符类或字符组.如果两个字符组的长度不相等,那么set2会不断复制其最后一个字符,直到长度与set1相同.若set2的长度大于set1,那么s在et2中超出set1长度的那部分字符则全部忽略.

#要将输入中的字符由大写转换成小写,可以使用下面的命令
$ echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
hello who is this

说明:'A-Z''a-z' 都是字符组。我们可以按照需要追加字符或字符类来构造自己的字符组.'ABD-}''aA.,''a-ce-x' 以及 'a-c0-9' 等均是合法的集合。定义集合也很简单,不
需要书写一长串连续的字符序列,只需要使用“ 起始字符  终止字符”这种格式就行了。这种写
法也可以和其他字符或字符类结合使用。如果“ 起始字符  终止字符”不是有效的连续字符序列,
那么它就会被视为含有3个元素的集合( 起始字符、  和终止字符)。你也可以使用像 '\t''\n'
这种特殊字符或其他ASCII字符。

工作原理:在tr中利用集合概念,将字符从一个集合映射到另一个集合中.如下面一个用tr进行数字加密和解密的例子

[root@rwwh rh]# echo 12345 | tr '0-9' '9876543210'
87654 #加密
[root@rwwh rh]# echo 87654 | tr '9876543210' '0-9'
12345 #解密

#tr可以将制表符转换成单个空格
tr '\t' ' ' < file.txt

 ①用tr删除字符

#只使用set1,不使用set2
[root@rwwh rh]# echo "Hello 123 world 456" |tr -d '0-9'
Hello  world 

②字符组补集

#利用选项 -c 来使用 set1 的补集。下面的命令中, set2 是可选的:
tr -c [set1] [set2]
#会从输入文本中删除不在补集中的所有字符
[root@rwwh rh]# echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
 1  2  4
#会将不在 set1 中的字符替换成空格
[root@rwwh rh]# echo hello 1 char 2 next 4 | tr  -c '0-9' ' '
      1      2      4

③同tr压缩字符

#删除多余空格
$ echo "GNU is not UNIX. Recursive right ?" | tr -s ' '
GNU is not UNIX. Recursive right ?
#删除多余换行符
$ cat multi_blanks.txt | tr -s '\n'
line 1
line 2
line 3
line 4

④使用技巧:使用tr进行算术运算

[root@rwwh rh]# cat sum.txt | echo $[ $(tr '\n' '+' ) 0 ]
15

解析说明:在命令中, tr 命令将 '\n' 替换成了 '+' ,我们因此得到了字符串 1+2+3+..5+ ,但是在字符
串的尾部多了一个操作符 + 。为了抵消这个多出来的操作符,我们再追加一个 0 ,$[ operation ] 执行算术运算,因此就形成了以下命令:echo $[ 1+2+3+4+5+0 ]

如果有一个包含字母和数字的文件,我们想计算其中的数字之和,这需要更强的技巧性:
$ cat test.txt
first 1
second 2
third 3
利用 tr 的 -d 选项删除文件中的字母,然后将空格替换成 + :
$ cat test.txt | tr -d [a-z] | echo "total: $[$(tr ' ' '+')]"
total: 6

⑤字符类

tr 可以将不同的字符类作为集合使用,所支持的字符类如下所示

[root@rwwh rh]# echo hello 1 char 2 next 4 | tr '[:lower:]' '[:upper:]'
HELLO 1 CHAR 2 NEXT 4

 三 校验和与核实

    校验和(checksum)程序用来对文件中生成相对较小的唯一的密钥.我们可以重新计算该密钥,用以检查文件是否发生改变.Unix和Linux支持多种校验和程序,但强健性最好且使用最为广泛的校验和算法是MD5和SHA-1.md5sum和sha1sum程序可以对数据应用对应的算法来生成校验和

#使用md5sum计算文件的校验和,md5sum是一个长度为32个字符的十六进制串
[root@rwwh ~]# md5sum test.txt 
c010aff9dc6276fdb7efefd1a2757658  test.txt
#可以将输出的校验和重定向到一个文件中
[root@rwwh ~]# md5sum test.txt > file_sum.md5
[root@rwwh ~]# cat file_sum.md5 
c010aff9dc6276fdb7efefd1a2757658  test.txt
#md5sum -c 会输出校验和是否匹配的信息

[root@rwwh ~]# md5sum -c *.md5
test.txt: OK
[root@rwwh ~]# cat file_sum.md5
c010aff9dc6276fdb7efefd1a2757658 test.txt
[root@rwwh ~]# echo "888" >> test.txt
[root@rwwh ~]# md5sum -c *.md5
test.txt: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match

#可以同时输出多个文件的校验和信息

[root@rwwh ~]# md5sum test.txt testq.txt
c010aff9dc6276fdb7efefd1a2757658 test.txt
5dec1b32ee1ee527102fcfa99e0a2d99 testq.txt

#使用SHA-1校验,用法与MD5sum一致 


[root@rwwh ~]# sha1sum test.txt
ef5e916cd502f1b5ade7e015e72e1f08588756a8 test.txt

 

 对目录进行校验

  校验和是从文件中计算得来的.对目录计算校验和意味着需要对目录中的所有文件以递归的方式进行计算.

$ md5deep -rl directory_path > directory.md5
# -r 使用递归遍历
# -l 使用相对路径。默认情况下,md5deep 会输出文件的绝对路径
#结合find递归计算校验和
$ find directory_path -type f –print0 | xargs -0 md5sum >> directory.md5
#进行核实
$ md5sum -c directory.md5

 

四 加密工具与散列

  加密技术主要用于防止数据遭遇未经授权的访问.和上面的校验和算法不同,加密算法可以无损地重构原始数据

  crypt(需要安装)

     crypt 命令通常并没有安装在Linux系统中。它是一个简单的加密工具,相对而言不是那么安全。该命令从 stdin 接受输入,要求用户创建口令,然后将加密数据输出到  stdout :

$ crypt <input_file >output_file
Enter passphrase:
我们在命令行上提供口令:
$ crypt PASSPHRASE <input_file >encrypted_file
如果需要解密文件,可以使用:
$ crypt PASSPHRASE -d <encrypted_file >output_file

  gpg

   gpg (GNU privacy guard,GNU隐私保护)是一种应用广泛的工具,它使用加密技术来保护文件,以确保数据在送达目的地之前无法被读取

用 gpg 加密文件:
$ gpg -c filename
命令会采用交互方式读取口令并生成filename.gpg。使用以下命令解密gpg文件:
$ gpg filename.gpg
上述命令读取口令并解密文件

Base64

   Base64是一组相似的编码方案,它将二进制数据转换成以64为基数的形式(radix-64representation)

,以可读的ASCII字符串进行描述.这类编码程序可用于通过E-mail传输二进制数据。 base64 命令能够编码/解码Base64字符串。要将文件编码为Base64格式,可以使用:

$ base64 filename > outputfile
或者
$ cat file | base64 > outputfile
base64 命令可以从 stdin 中读取。
解码Base64数据:
$ base64 -d file > outputfile
或者
$ cat base64_file | base64 -d > outputfile

 

 

 

posted on 2020-06-14 17:13  rwwh  阅读(804)  评论(0)    收藏  举报

导航