前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell脚本之常用Linux命令使用介绍

Shell脚本之常用Linux命令使用介绍

作者头像
全栈工程师修炼指南
发布2022-09-28 20:38:35
1.2K0
发布2022-09-28 20:38:35
举报

[TOC]

0x01 Linux 内置

xargs 命令 (重要)

描述:xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

其读取输入数据重新格式化后输出,它擅长将标准输入数据转换成命令行参数,而且能够处理管道或者stdin并将其转换成特定命令的命令参数,也可以将单行或多行文本输入转换为其他格式,例如多行变单行以及单行变多行;

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

xargs 默认命令是echo 意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,

Tips: 关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令

语法选项:

代码语言:javascript
复制
somecommand |xargs -item  command

-0 :#将\0作为定界符。
-a :#指定一个xargs脚本文件
-n <数字>: #指定每行显示多少列; 
-d '定界字符': #指定一个定界符注意必须是单字符;
-I : #指定一个替换字符串{},这个字符串再xargs扩展时会被替换掉,当-I与xargx联合使用的时候每一个参数命令都会被执行一次,类似于find的-ok/-exec选项
-i,-I  # 这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-L num # 从标准输入一次读取 num 行送给 command 命令。
-n, --max-args=MAX-ARGS   # 每个命令最多使用MAX-ARGS参数行
-P, --max-procs=MAX-PROCS # 一次运行最多的max-procs进程
-p, --interactive         # 运行命令前提示
-s, --max-chars=MAX-CHARS    # 最多将命令限制为MAX-CHARS
-x, --exit   #如果超过大小(参见-s),则退出。
-t # 表示先打印命令,然后再执行。
-r no-run-if-empty # 当xargs的输入为空的时候则停止xargs,不用再去执行了。

实际案例:

代码语言:javascript
复制
#定义一个测试文件,内有多行文本数据:
$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
WeiyiGeek.示例1

WeiyiGeek.示例1

代码语言:javascript
复制
#示例3.读取stdin将格式化后的参数传递给命令
#假设一个命令为 sk.sh 和一个保存参数的文件arg.txt:

#!/bin/bash 
echo $*  #sk.sh命令内容,打印出所有参数

#arg.txt文件内容:
aaa
bbb
ccc

#可以利用这个来更改ip文本以及脚本参数的传入
cat arg.txt | xargs -I {} ./sk.sh -p {} -l 
cat arg.txt | xargs -I {} echo $* "-p123" {}"- l123"
-p aaa -l 
-p bbb -l 
-p ccc -l
WeiyiGeek.-I于xargs
WeiyiGeek.-I于xargs

WeiyiGeek.-I于xargs

代码语言:javascript
复制
#示例4. 复制所有图片文件到 /data/images 目录下:
ls *.png *.jpg *.gif | xargs -n1 -I {} cp {} /data/images


#示例5.xargs结合find使用 ,ls -i 排除显示指定的文件
#用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -n1 --null   #换行或者空格分割以-n1有关系
# ./tuned/tuned.log
# ./audit/audit.log
# ./anaconda/anaconda.log
# ./anaconda/X.log
# ./anaconda/program.log

find . -type f -name "*.log" -print0 | xargs -0 -n3
# ./tuned/tuned.log ./audit/audit.log ./anaconda/anaconda.log
# ./anaconda/X.log ./anaconda/program.log ./anaconda/packaging.log
# ./anaconda/storage.log ./anaconda/ifcfg.log ./anaconda/ks-script-ECgRju.log

find . -type f -name "*.log" -print0 | xargs -0 rm -f #每个参数都回执行


#示例6.统计文件信息
find . -type f -name "*.php" -print0 | xargs -0 wc -l #统计一个源代码目录中所有php文件的行数

#示例7.查找所有的jpg 文件,并且压缩它们
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz 


#示例7.其他补充使用
cat url-list.txt | xargs wget -c #假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接
WeiyiGeek.xargs使用
WeiyiGeek.xargs使用

WeiyiGeek.xargs使用

示例8.xargs替换字符串来更改ip文本:

代码语言:javascript
复制
#!/bin/bash
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脚本并发执行命令

代码语言:javascript
复制
thread_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 {}

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命令。

安装 系统默认不带该命令,我们需要从软件仓库中进行下载使用。

代码语言:javascript
复制
# Ubuntu
apt install -y dos2unix

# CentOS
yum install -y dos2unix

语法

代码语言:javascript
复制
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]

选项解析:

代码语言:javascript
复制
1. -k:保持输出文件的日期不变 
2. -q:安静模式,不提示任何警告信息
3. -V:查看版本
4. -c:转换模式,模式有:ASCII, 7bit, ISO, Mac, 默认是:ASCII
5. -o:写入到源文件
6. -n:写入到新文件

使用示例

代码语言:javascript
复制
# 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 格式
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 Linux 内置
    • xargs 命令 (重要)
    • 0x01 外置扩展
      • dos2unix 命令 - 将DOS格式的文本文件转换成UNIX格式的
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档