[TOC]
0x01 Linux 内置
xargs 命令 (重要)
描述:xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
其读取输入数据重新格式化后输出,它擅长将标准输入数据转换成命令行参数,而且能够处理管道或者stdin并将其转换成特定命令的命令参数
,也可以将单行或多行文本输入转换为其他格式,例如多行变单行以及单行变多行;
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认命令是echo 意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,
Tips: 关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令
语法选项:
1 | somecommand |xargs -item command |
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#定义一个测试文件,内有多行文本数据:
$cat test.txt
a b c d e f
g h i j k l
m n o p q r
s t u v w x y z
#示例1.多行输入单行输出和指定行输出
cat test.txt | xargs
# a b c d e f g h i j k l m n o p q r s t u v w x y z
cat test.txt | xargs -n3 #每行显示3个参数
# a b c
# d e f
# g h i
#示例2.指定一个定界符进行分割
echo "nameXnameXnameXname" | xargs -dX
echo "nameXnameXnameXname" | xargs -dX -n2 #结合n使用
name name
name name
echo "testp-testp-wwwp-www" | xargs -d 'p'
# test -test -www -www
#示例3查找所有不可修改的文件 (对于入侵监测的时候可使用)
find . | xargs -I file lsattr -a file 2>/dev/null | grep '^----i'

WeiyiGeek.示例1
1 | #示例3.读取stdin将格式化后的参数传递给命令 |

WeiyiGeek.-I于xargs
1 | #示例4. 复制所有图片文件到 /data/images 目录下: |

WeiyiGeek.xargs使用
示例8.xargs替换字符串来更改ip文本:1
2
3
4
5
6
7
XARGX替换url.txt front/back字符
cat url.txt | xargs -I {} echo $* "Url:"{}"/admin/web.jsp" #method 1
awk '{print "Url:"$1"/admin/web.jsp"}' url.txt
# Url:http://192.168.2.2:8080/admin/web.jsp
# Url:http://192.168.2.1:8081/admin/web.jsp
# Url:http://192.168.1.101:80/admin/web.jsp
示例9.xargs脚本并发执行命令1
2
3thread_num=256
ls | xargs -n 1 -I {} -P ${thread_num} sh -c "/usr/binfs_upload_file /etcfs/client.conf {}"
ls -I '*.yml' | xargs -I {} rm -rf {}
mapfile 命令 - 用于从标准输入或文件描述符读取行并赋值到数组
描述: 该命令主要用于将标准输入中的行读取到索引数组变量中, MAPFILE 变量是默认数组。
语法参数1
2
3
4
5
6
7
8
9
10
11
12
13
14mapfile: mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
Options:
-d delim Use DELIM to terminate lines, instead of newline
-n count 从标准输入中获取最多count行,如果count为零那么获取全部
-O origin 从数组下标为origin的位置开始赋值,默认的下标为0
-s count 跳过对前count行的读取
-t 从每行读取中删除一个尾随的 DELIM(默认换行)
-u fd Read lines from file descriptor FD instead of the standard input
-C callback Evaluate CALLBACK each time QUANTUM lines are read.每次读取量子线时计算回调
-c quantum Specify the number of lines read between each call to CALLBACK.指定每次回调调用之间读取的行数
Arguments:
ARRAY Array variable name to use for file data
实践使用
1 | # 1.将磁盘分区信息以数组的方式赋予DFH变量。 |
0x01 外置扩展
dos2unix 命令 - 将DOS格式的文本文件转换成UNIX格式的
描述: 用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。
- DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A。
- Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是0A。
DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M,而且很多命令都无法很好的处理这种格式的文件,而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。
安装
系统默认不带该命令,我们需要从软件仓库中进行下载使用。1
2
3
4
5# Ubuntu
apt install -y dos2unix
# CentOS
yum install -y dos2unix
语法1
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
选项解析:1
2
3
4
5
61. -k:保持输出文件的日期不变
2. -q:安静模式,不提示任何警告信息
3. -V:查看版本
4. -c:转换模式,模式有:ASCII, 7bit, ISO, Mac, 默认是:ASCII
5. -o:写入到源文件
6. -n:写入到新文件
使用示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 1.最简单的用法就是dos2unix直接跟上文件名。
dos2unix file1.sh file2.sh
# 2.如果一次转换多个文件,把这些文件名直接跟在dos2unix之后(注:也可以加上-o参数,也可以不加,效果一样)
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3
# 3.如果想把转换的结果保存在别的文件,而源文件不变,则可以使用-n参数。
dos2unix -n oldfile newfile
# 4.如果要保持文件时间戳不变,加上-k参数
dos2unix -k file
dos2unix -k file1 file2 file3
dos2unix -k -o file1 file2 file3
# 5.递归替换目录中的所有文件,例如批量替换为linux或者dos文件格式:
sudo find public/components/ -name "*.py" | xargs dos2unix # linux 格式
sudo find public/components/ -name "*.py" | xargs unix2dos # dos 格式