Linux 常用命令(文件传输、网络通讯、软件包下载与安装、Shell 脚本编程常用命令)大全(三)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Linux 常用命令(文件传输、网络通讯、软件包下载与安装、Shell 脚本编程常用命令)大全(三)

文件传输

tftp:上传及下载文件

tftp 命令用于传输文件。ftp 让用户得以下载存放于远端主机的文件,也能将文件上传到远端主机放置。

tftp 是简单的文字模式 ftp 程序,它所使用的指令和 ftp 类似。

语法格式:

tftp [参数]

# 常用参数:
    connect    连接到远程tftp服务器
    mode    文件传输模式
    put        上传文件
    get        下载文件
    quit    退出
    verbose    显示详细的处理信息
    trace    显示包路径
    status    显示当前状态信息
    binary    二进制传输模式
    ascii    ascii 传送模式
    rexmt    设置包传输的超时时间
    timeout    设置重传的超时时间

参考实例:

# 连接远程服务器”218.28.188.288″:
[root@linuxcool ~]$ tftp 218.28.188.288 
tftp> get file       # 远程下载file文件:                
getting from 218.28.188.288 to /dir  
Recived 168236 bytes in 1.5 seconds[112157 bit/s] 
tftp> quit           # 退出tftp:             


curl:文件传输工具

  • curl 命令是一个利用 URL 规则在 shell 终端命令行下工作的文件传输工具;

    它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。

  • 作为一款强力工具,curl 支持包括 HTTP、HTTPS、ftp 等众多协议,还支持 POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征;做网页处理流程和数据检索自动化。

语法格式:

curl [参数] [网址]

# 常用参数:
    -O    把输出写到该文件中,保留远程文件的文件名
    -u    通过服务端配置的用户名和密码授权访问

参考实例:

# 将下载的数据写入到文件,必须使用文件的绝对地址:
curl https://www.linuxcool.com/abc.txt --silent -O
# 访问需要授权的页面时,可通过-u选项提供用户名和密码进行授权:
$ curl -u root https://www.linuxprobe.com/
Enter host password for user 'root':


scp:与远程主机上的文件/目录拷贝

# 从远程复制到本地
# 语法:
scp [-r] 用户名@主机ip:绝对路径 存放路径
# 选项:
-r :递归复制目录
# 参考实例:复制远程主机上的test.zip文件到当前目录下
scp root@30.23.17.201:/home/test.zip ./

# 从本地复制到远程
scp [-r] 存放路径 用户名@主机ip:绝对路径
# 选项:
-r :递归复制目录


rsync:远程数据同步

rsync 命令是一个功能非常强大的远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。

rsync 使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

语法:

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

使用示例:

# 拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式
rsync -a /data /backup

# 将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
rsync -avz *.c foo:src

# 将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
rsync -avz foo:src/bar /data

# 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
rsync -av root@192.168.78.192::www /databack

# 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
rsync -av /databack root@192.168.78.192::www

# 列出远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
rsync -v rsync://192.168.78.192/www

参数选项:

-v, --verbose         # 详细模式输出。 
-q, --quiet         # 精简输出模式。 
-c, --checksum         # 打开校验开关,强制对文件传输进行校验。 
-a, --archive         # 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。 
-r, --recursive     # 对子目录以递归模式处理。 
-R, --relative         # 使用相对路径信息。 
-b, --backup         # 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。
                      # 可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir         # 将备份文件(如~filename)存放在在目录下。 -suffix=SUFFIX 定义备份文件前缀。 
-u, --update         # 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。 
-l, --links         # 保留软链结。 
-L, --copy-links     # 想对待常规文件一样处理软链结。 
--copy-unsafe-links # 仅仅拷贝指向SRC路径目录树以外的链结。 
--safe-links         # 忽略指向SRC路径目录树以外的链结。 
-H, --hard-links     # 保留硬链结。 
-p, --perms         # 保持文件权限。 
-o, --owner         # 保持文件属主信息。 
-g, --group         # 保持文件属组信息。 
-D, --devices         # 保持设备文件信息。 
-t, --times         # 保持文件时间信息。 
-S, --sparse         # 对稀疏文件进行特殊处理以节省DST的空间。 
-n, --dry-run        # 现实哪些文件将被传输。 
-w, --whole-file    # 拷贝文件,不进行增量检测。 
-x, --one-file-system     # 不要跨越文件系统边界。 
-B, --block-size=SIZE     # 检验算法使用的块尺寸,默认是700字节。 
-e, --rsh=command         # 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH         # 指定远程服务器上的rsync命令所在路径信息。 
-C, --cvs-exclude     # 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。 
--existing             # 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。 
--delete             # 删除那些DST中SRC没有的文件。 
--delete-excluded     # 同样删除接收端那些被该选项指定排除的文件。
--delete-after         # 传输结束以后再删除。 
--ignore-errors     # 及时出现IO错误也进行删除。 
--max-delete=NUM     # 最多删除NUM个文件。 
-P,    --partial         # 保留那些因故没有完全传输的文件,以是加快随后的再次传输。 
--force             # 强制删除目录,即使不为空。 
--numeric-ids         # 不将数字的用户和组id匹配为用户名和组名。 
--timeout=time         # ip超时时间,单位为秒。 
-I, --ignore-times         # 不跳过那些有同样的时间和长度的文件。 
--size-only             # 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。 
--modify-window=NUM     # 决定文件是否时间相同时使用的时间戳窗口,默认为0。 
-T --temp-dir=DIR         # 在DIR中创建临时文件。 
--compare-dest=DIR         # 同样比较DIR中的文件来决定是否需要备份。 
--progress                 # 显示备份过程。 
-z, --compress             # 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN         # 指定排除不需要传输的文件模式。
--include=PATTERN         # 指定不排除而需要传输的文件模式。
--exclude-from=FILE     # 排除FILE中指定模式的文件。
--include-from=FILE     # 不排除FILE指定模式匹配的文件。 
--version             # 打印版本信息。 
--address            # 绑定到特定的地址。 
--config=FILE         # 指定其他的配置文件,不使用默认的rsyncd.conf文件。 
--port=PORT         # 指定其他的rsync服务端口。 
--blocking-io        # 对远程shell使用阻塞IO。 
-stats                 # 给出某些文件的传输状态。 
--progress             # 在传输时现实传输过程。
--log-format=formAT     # 指定日志文件格式。 
--password-file=FILE     # 从FILE中得到密码。 
--bwlimit=KBPS         # 限制I/O带宽,KBytes per second。 
-h, --help             # 显示帮助信息。


网络通讯

ssh:安全连接客户端

ssh 命令是 openssh 套件中的客户端连接工具,可以给予 ssh 加密协议实现安全的远程登录服务器,实现对服务器的远程管理。

语法格式:

ssh [参数] [远程主机]

# 常用参数:
    -1            强制使用ssh协议版本1
    -2            强制使用ssh协议版本2
    -4            强制使用IPv4地址
    -6            强制使用IPv6地址
    -A            开启认证代理连接转发功能
    -a            关闭认证代理连接转发功能
    -b<IP地址>   使用本机指定的地址作为对位连接的源IP地址
    -C            请求压缩所有数据
    -F<配置文件>  指定ssh指令的配置文件,默认的配置文件为“/etc/ssh/ssh_config”
    -f            后台执行ssh指令
    -g            允许远程主机连接本机的转发端口
    -i<身份文件>  指定身份文件(即私钥文件)
    -l<登录名>       指定连接远程服务器的登录用户名
    -N         不执行远程指令
    -o<选项>    指定配置选项
    -p<端口>    指定远程服务器上的端口
    -q          静默模式,所有的警告和诊断信息被禁止输出
    -X          开启X11转发功能
    -x          关闭X11转发功能
    -y          开启信任X11转发功能

参考实例:

# 登录远程服务器:
ssh 用户名@ip
# 用test用户连接远程服务器:
ssh -l test 202.102.220.88
# 查看分区列表:
ssh 202.102.220.88 /sbin/fdisk
# 强制使用ssh协议版本1:
ssh -1
# 开启认证代理连接转发功能:
ssh -A


ping:测试主机间网络连通性

  • ping 命令主要用来测试主机之间网络的连通性,也可以用于执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息

    若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

  • 不过值得注意的是:Linux 系统下的 ping 命令与 Windows 系统下的 ping 命令稍有不同。

    • Windows 下运行 ping 命令一般会发出 4 个请求就结束运行该命令;
    • Linux 下运行 ping 命令不会自动终止,需要按 CTR+C 终止或者使用 -c 参数为ping命令指定发送的请求数目。

语法格式:

ping [参数] [目标主机]

# 常用参数:
    -c    指定发送报文的次数
    -i    指定收发信息的间隔时间
    -I    使用指定的网络接口送出数据包
    -l    设置在送出要求信息之前,先行发出的数据包
    -n    只输出数值
    -p    设置填满数据包的范本样式
    -q    不显示指令执行过程
    -R    记录路由过程
    -s    设置数据包的大小
    -t    设置存活数值TTL的大小
    -v    详细显示指令的执行过程
    -d    使用Socket的SO_DEBUG功能

参考实例:

# 检测与linuxcool网站的连通性:
ping www.linuxcool.com
# 连续ping4次:
ping -c 4 www.linuxcool.com 
# 设置次数为4,时间间隔为3秒:
ping -c 4 -i 3 www.linuxcool.com
# 利用ping命令获取指定网站的IP地址:
$ ping -c 1 linuxcool.com | grep from | cut -d " " -f 4
220.181.57.216


ifconfig:显示或设置网络设备

ifconfig 命令的英文全称是“network interfaces configuring”,即用于配置和显示 Linux 内核中网络接口的网络参数。

ifconfig 命令可以配置的网卡信息,但在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。

语法格式:

ifconfig [参数]

# 常用参数:
    add<地址>     设置网络设备IPv6的IP地址
    del<地址>     删除网络设备IPv6的IP地址
    down      关闭指定的网络设备
    up          启动指定的网络设备
    IP地址     指定网络设备的IP地址

参考实例:

# 显示网络设备信息:
ifconfig
# 启动关闭指定网卡:
ifconfig eth0 down
ifconfig eth0 up 
# 为网卡配置和删除IPv6地址:
ifconfig eth0 add 33ffe:3240:800:1005::2/64
ifconfig eth0 del 33ffe:3240:800:1005::2/64
# 用ifconfig修改MAC地址:
ifconfig eth0 down
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE
ifconfig eth0 up
ifconfig eth1 hw ether 00:1D:1C:1D:1E 
ifconfig eth1 up
# 配置IP地址:
ifconfig eth0 192.168.1.56 
ifconfig eth0 192.168.1.56 netmask 255.255.255.0
ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255


软件包下载与安装

rpm:RPM 软件包管理器

rpm 命令是 Red-Hat Package Manager(RPM软件包管理器)的缩写, 该命令用于管理 Linux 下软件包的软件。在 Linux 操作系统下,几乎所有的软件均可以通过RPM 进行安装、卸载及管理等操作。

概括的说,rpm 命令包含了五种基本功能:安装、卸载、升级、查询和验证。

语法格式:

rpm [参数] [软件包名]

# 常用参数:
# 查询/验证 软件包选项:
    -a, --all        查询所有的软件包
    -f, --file        查询文件或命令属于哪个软件包
    -p, --package    查询指定的rpm软件包
# 查询软件包选项(with -q or --query):
    -q, --query            查询软件包是否安装
    -l, --list            显示软件包的文件列表
    -c, --configfiles    列出组态配置文件,本参数需配合”-l”参数使用
    -d, --docfiles        列出文本文件,本参数需配合”-l”参数使用
    -s, --state            显示文件状态,本参数需配合”-l”参数使用
    -R                    显示软件包的依赖关系
# 安装/升级/删除选项:
    --test          不真正安装,只是判断下是否能安装
    -i, --install    安装软件包
    -h, --hash        安装软件包时列出标记(和 -v 一起使用效果更好)
    -e, --erase        卸载软件包
    -U, --upgrade    升级软件包
    
    -v, --verbose   提供更多的详细信息输出
    --force            强制

参考示例:

# 查询指定软件包是否安装
rpm -q 软件包名
# 列出所有已安装的软件包:
rpm -qa
# 查询软件包的详细信息
rpm -qi 软件包名
# 命令查询软件包的文件列表
rpm -ql 软件包名
# 命令查询系统文件属于哪个RPM包
rpm -qf 系统文件名
# 查询软件包的依赖关系
rpm -qR 软件包名
# 直接安装软件包:
rpm -ivh 软件包名
# 忽略报错,强制安装:
rpm --force -ivh 软件包名
# 卸载rpm包:
rpm -e 软件包名
# 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
rpm -e --nodeps 软件名        
# 升级软件包:
pm -U 软件包名


yum:基于 RPM 的软件包管理器

yum 命令是在 Fedora 和 RedHat 以及 SUSE 中基于 rpm 的软件包管理器,它可以使系统管理人员交互和自动化地更新与管理 RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

语法格式:

yum [options] [command] [package ...]

# 常用命令:
    list            # 列出所有已安装的和可安裝的软件包清单
    list installed    # 列出所有已安装的软件包清单
    list updates    # 列出所有可更新的软件包清单
    install            # 安装rpm软件包
    update            # 更新rpm软件包
    check-update    # 检查是否有可用的更新rpm软件包
    remove            # 删除指定的rpm软件包
    search            # 检查软件包的信息
    info            # 显示指定的rpm软件包的描述信息和概要信息
    clean            # 清理yum过期的缓存
    shell            # 进入yum的shell提示符
    resolvedep        # 显示rpm软件包的依赖关系
    localinstall    # 安装本地的rpm软件包
    localupdate        # 显示本地rpm软件包进行更新
    deplist            # 显示rpm软件包的所有依赖关系

# 常用参数:
    -y    对所有的提问都回答“yes”
    -c    指定配置文件
    -q    安静模式。不显示安装的过程
    -v    详细模式
    -t    检查外部错误
    -d    设置调试等级(0-10)
    -e    设置错误等级(0-10)
    -R    设置yum处理一个命令的最大等待时间
    -C    完全从缓存中运行,而不去下载或者更新任何头文件
    -h    显示帮助信息

参考实例:

# 列出所有已安装的和可安裝的软件包清单
yum list
# 列出以mysql开头的已安装的和可安裝的软件包清单
yum list mysql*
# 列出匹配到“mysql*”的可用的数据包:
yum list available 'mysql*' 
# 自动搜索安装最快镜像插件:
yum install yum-fastestmirror
# 安装yum图形窗口插件:
yum install yumex
# 查看可能批量安装的列表:
yum grouplist
# 安装常用工具软件及依赖
yum groupinstall base
# 卸载/删除vim-common:
yum remove vim-common.x86_64
# 清除缓存目录下的软件包:
yum clean packages
# 显示httpd安装包信息:
yum info httpd.x86_64


离线安装 rpm 包自动解决依赖

参考:centos7离线安装rpm包自动解决依赖

当生产环境由于安全原因处于断网状态时,要安装 linux 软件只能通过本地源的方式:

  1. 外网主机通过 downloadonly 或 yumdownloade 插件获取该软件及其依赖包,供本地源使用。
  2. 使用 yum localinstall 自动安装软件,并且自动处理好依赖关系。
# 安装 yum-plugin-downloadonly插件(外网主机)。一般yum自带此插件,不用安装
yum install -y yum-plugin-downloadonly

# 使用yum配合插件下载软件包(rpm)到本地目录
yum install --downloadonly --downloaddir=DIR 软件包名
# 说明:
    --downloadonly        # 仅下载,不安装
    --downloaddir=DIR    # 指定下载存储路径

# 本地安装软件包(自动解决依赖)
yum localinstall *.rpm -y


wget:从 Web 下载文件

参考:wget命令详解

支持 HTTP、HTTPS及FTP协议下载文件,而且wget还提供了很多选项,例如下载多个文件、后台下载,使用代理等等

语法格式:wget [options] [url]

常用参数选项 [options] :

-O        # 选项以其他名称保存下载的文件
-N        # 只获取比本地文件新的文件
-P         # 选项将文件下载到指定目录
-c         # 选项断点续传。
          # 当下载一个大文件时,如果中途网络断开导致没有下载完成,可以使用命令的-c选项恢复下载,让下载从断点续传,无需从头下载
-b         # 选项在后台下载
-i         # 选项下载多个文件。
          # 如果先要一次下载多个文件,首先需要创建一个文本文件,并将所有的url添加到该文件中,每个url都必须是单独的一行。
          # 然后使用-i选项,后跟该文本文件
-U         # 选项设定模拟下载。如果远程服务器阻止wget下载资源,我们可以通过-U选项模拟浏览器进行下载,例如下面模拟谷歌浏览器下载。
--limit-rate     # 选项限制下载速度


Shell 脚本编程常用命令

echo:输出字符串或提取Shell变量的值

echo命令用于在终端设备上输出字符串或变量提取后的值,这是在 Linux 系统中最常用的几个命令之一。

  • 一般使用在变量前加上$符号 的方式提取出变量的值,例如:$PATH,然后再用 echo 命令予以输出。
  • 或者直接使用 echo 命令输出一段字符串到屏幕上,起到给用户提示的作用。

语法格式:

echo [参数] [字符串]

# 常用参数:
-n            # 不输出结尾的换行符
-E             # 禁用反斜杠转译
-e            # 开启输出字串中对反斜杠的转译,即支持 \n 换行
# 只有开启-e参数的时候,下面的命令才能起作用:
    \0NNN         # 输出NNN(一个八进制数)在ASCII码表中对应的字符,如:a->97(十进制)->141(八进制),echo -e "\0141" 结果:a
    \\             # 输出反斜杠
    \a             # 报鸣
    \b             # 退格,即删除前面的一个字符
    \c             # 抑制当前行的换行符(但是结果是\c后面的字符都没有显示)
    \f             # 填表格(就是新起一行打印,但是纵向的位置不变)
    \n             # 换行,光标移至行首
    \r             # 光标移至行首,但不换行
    \t             # 水平制表符
    \v             # 垂直制表符(效果好像和\f一样)

注意:

  • echo 后面使用双引号的话,双引号里面的内容会翻译,输出value
  • 单引号的话,双引号里面的内容不会翻译,输出$key

    $key=value
    
    echo "$key"        # 输出结果:value
    echo '$key'        # 输出结果:$key

参考示例:

# 输出一段字符串:
echo "LinuxCool.com" 
输出:LinuxCool.com 
# 返回上一条命令的执行结果。0:成功;非0:失败
echo $?
# 输出变量提取后的值:
echo $PATH
输出:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 对内容进行转义,不让$符号的提取变量值功能生效:
echo \$PATH
输出:$PATH
# 查看自己linux系统的默认解析器
echo $SHELL
# 结合输出重定向符,将字符串信息导入文件中:
echo "It is a test" > linuxcool
# 使用反引号符执行命令,并输出其结果到终端:
echo `date`
# 输出带有换行符的内容:
echo -e "a\nb\nc"
输出:
a
b
c
# 输出信息中删除某个字符,注意看数字3消失了:
echo -e "123\b456" 
输出:12456


awk:文本和数据进行处理的编程语言

参考:Linux:“awk”命令的妙用

awk 是一个强大的文本分析工具,简单来说 awk 就是把 管道 或文件逐行读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理

语法格式:

awk [参数] 'COMMAND' [文件]

# 注意:COMMAND(命令)只能使用单引号包裹
# 常用参数:
-F '分隔符'    # 指定字段分隔符。不指定默认使用空格、制表符作为分隔符。单引号、双引号包裹均可
-v              # 自定义变量
-f              # 从脚本中读取awk命令
-m              # 对val值设置内在限制
-v var=$val, --assign=var=$val    # 给COMMAND中传脚本变量值
                                  # 先将脚本变量赋值awk内部自定义变量(var),再在awk命令中使用内部变量var)

# awk 会根据分隔符将行分成若干个字段,$0为整行,$1为第一个字段,$2 为第2个地段...
# 为打印一个字段或所有字段,使用 print 命令。这是一个 awk 动作

# 参考实例
# 打印管道输入的第1个字段
echo "this is a test" | awk '{print $1}'
# 输出:
this

# 打印每一行的第二和第三个字段
awk '{print $2,$3}' file 

awk 取行,匹配文件内容

awk -F ":" '{print $1 " " $3}' /etc/passwd        # $1与$3之间手动添加空格分隔
awk '/ljc/' file                                  # 显示文件file中包含ljc的匹配行。
awk '!/ljc/' file                                  # 显示文件file中不包含ljc的匹配行。
awk '/起始内容/,/终止内容/' file                   # 取包含内容的区间行区间匹配
awk '/halt|sync/' file                            # 匹配halt或者sync的行
awk 'NR>=5 && NR<=10' file                          # 取5到10行,逻辑与
awk -F ": '$1~/mail/ || $3>1 {print }' /ljc        # 取$1或者mail或者$3>1的行,逻辑或

awk 中的替换

# 替换但不修改文件内容
gsub(/目标/,"替换为什么",第几列)
gsub(/目标/,"替换为什么")    等同    gsub(/目标/,"替换为什么",$0)
# 例:
awk 'gsub(/halt/,"tihuang")' liangjc.txt 

awk 内置变量

# 变量名              解释
FILENAMEawk        # 浏览的文件名
FS                # 设置输入字段分隔符,等价于命令行-F选项
NF                 # 浏览记录的字段个数
NR                 # 已读的记录数
$n                # awk会根据分隔符将行分成若干个字段,$0为整行,$1为第一个字段,$2 为第2个地段...

# 参考实例
# 打印行号在第一列
echo "this is a test" | awk '{print NR "  " $1}'
# 输出:
1  this

# 打印每行列数
echo "this is a test" | awk '{print NF}'
# 输出:
4

awk 内置函数

# 函数名             作用
toupper(s)        # 返回s的大写
tolower(s)         # 返回s的小写
length(s)         # 返回s长度
substr(s,p)     # 返回字符串s中从p开始的后缀部分

awk 条件操作符

# 操作符    描述
<          # 小于 
<=         # 小于等于 
==         # 等于 
!=         # 不等于 
~         # 匹配正则表达式 
!~         # 不匹配正则表达式 

awk 正则表达式匹配

# 符号        # 表达含义
*        # 与前面的正则表达式的零个或多个出现匹配
.        # 匹配任何单个字符
\        # 转义随后的特殊字符
+        # 匹配前面的正则表达式的一次或多次出现
^        # 作为正则表达式的第一个字符,表示匹配行的开始,以什么开头
$        # 作为正则表达式的最后一个字符,表示匹配行的结尾
?        # 匹配前面的正则表达式的零次或一次出现
{n,m}    # 匹配它前面某个范围内单个字符出现的次数,{n}将匹配n次出现,{n,}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现

支持 BEGIN 和 END 模块

awk 读取文件之后执行,先计算,最后END{}显示结果

# 参考实例:
# 打印管道输入的第1个字段,行前面加列名,最后一行添加 end
echo "this is a test" | awk '{print "name"} {print $1} END{print "end"}'
# 输出:
name
this
end


awk 流程控制语句(类C语言,java语言)

参考:https://www.cnblogs.com/minseo/p/13684207.html

条件判断语句

# if语句
{ if(条件) { 动作1; 动作2 } }            # 多个动作语句使用 ; 分隔
{ if(条件) 动作 }                     # 动作只有一条命令时,大括号可以省略

# if...else 语句
{ if(条件) { 动作 } else { 动作 } }

# if...else if...else 语句
{ if(条件1) { 动作 } else if (条件2) { 动作 } else { 动作 } }


# 示例
awk -F ':' '{ if ($1 > "d") { print $1 } else { print "-" } }' /etc/passwd
# 可以把流程控制语句放到一个脚本中,然后调用脚本执行,如test.sh的内容如下
{   
    if ($1 > "d") {  
        print $1   
    } else {  
        print "-"   
    }   
}
# 用如下方式执行,效果一样
awk -F ':' -f test.sh /etc/passwd

循环控制语句

break 用以结束循环

Continue 用于在循环体内部结束本次循环,从而直接进入下一次循环迭代

Exit 用于结束脚本程序的执行

# for语句。动作命令只有一条时,可以省略 { }
{ for (初始化动作; 条件; 递增/递减操作 ) { 动作 } }
# 示例
awk '{ for (i = 1; i <= 5; ++i) print i }'


# while语句。动作命令只有一条时,可以省略 { }
{ while(条件) { 动作 } }


xargs:给命令传递参数

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

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

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

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

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

xargs 一般是和管道一起使用。

命令格式:

SOME_COMMAND | xargs [OPTION]... COMMAND INITIAL-ARGS...
# 选项:
-n NUM, --max-args=NUM             # 从管道每次读取num个值作为一个参数传给 command 命令,默认是用所有的
-L LINES, -l LINES, --max-lines=LINES     # 从管道每次读取 LINES 行传给 command 命令
-d STRING, --delimiter=STRING    # 指定参数的分隔符(禁用引号和反斜杠)。
                                  # 默认argument(参数)的分隔符是空格,xargs分隔符是回车
-i R,     --replace=[R], -I R        # 从管道读取的参数替换初始参数中的R。若R未指定,默认R为{}。看linux具体支持哪个参数
-r, --no-run-if-empty         # 当xargs的输入为空的时候则停止xargs,不用再去执行了
-t, --verbose                # 表示先打印命令,然后再执行
-p, --interactive             # 每次执行一个管道参数的时候询问一次用户
-a FILE, --arg-file=FILE    # 从文件中读入作为 stdin
-s NUM, --max-chars=NUM     # 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数
-x, --exit                    # 如果超出大小(参见-s),则退出。主要是配合-s使用
--process-slot-var=VAR        # 在子进程中设置环境变量VAR
-e [END], --eof[=END], -E [END]        # END必须是一个以空格分隔的标志,当xargs分析到含有END这个标志的时候就停止

参考实例:

# 遍历打印当前文件夹的文件名和目录名
ls | xargs -n1 echo

# 遍历打印当前文件夹的文件名和目录名,使用预定义传参
ls | xargs -n1 -i echo "file name: {}, 1"

# 多行输入单行输出
cat test.txt | xargs

# 指定参数分隔符
$ echo "nameXnameXnameXname" | xargs -dX
name name name name


read:接收键盘或其它文件描述符的输入

read 命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read 命令将数据放入一个标准变量中。

格式:

read [选项] [变量名...]

# 选项:
-p str        # “提示信息”:在等待read输入时,输出提示信息
-t int        # 秒数。read命令会一直等待用户输入,使用此选项可以指定等待时间
-n int        # 字符数。read命令只接收指定的字符数就会执行
-s            # 隐藏输入的数据,适用于机密信息的输入

注意:

  • 变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量 REPLY 中;
  • 如果只提供了一个变量名,则将整个输入行赋予该变量;
  • 如果提供了一个以上的变量名,则输入行以空格分隔的若干字段会一个接一个地赋值各个变量,

    • 若输入的字段数大于变量数,则命令行上的最后一个变量被赋值剩余的所有字段
    • 若输入的字段数少于变量数,则未被赋值的变量值为空

使用示例

#读取从键盘的输入,并赋值给website变量 
read website  

# cat 命令的输出作为read命令的输入,read读到的值放在line变量中
cat test.txt | read line


tee:打印标准输出并储存到文件中

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

语法:

tee [options] [文件...]

# 选项:
 -a, --append                # 附加到既有文件的后面,而非覆盖它
 -i-i, --ignore-interrupts     # 忽略中断信号

输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

注意:文件描述符: 0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。


(1)输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意:任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用 >> 操作符。

实例:

# 执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):
$ who > users

# 执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

# 使用 cat 命令查看文件内容:
$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33 

# 输出重定向会覆盖文件内容,请看下面的例子:
$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
菜鸟教程:www.runoob.com

# 如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
菜鸟教程:www.runoob.com
菜鸟教程:www.runoob.com


(2)输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

实例:

# 接着以上实例,我们需要统计 users 文件的行数,执行以下命令:
$ wc -l users
2 users
       
# 也可以将输入重定向到 users 文件:
$ wc -l < users
2 

# 注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

# 同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
command1 < infile > outfile


(3)重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:

# stderr 重定向到 file
$ command 2>file
#  stderr 追加到 file 文件末
$ command 2>>file

# 将 stdout 和 stderr 合并后重定向到 file
$ command > file 2>&1    或    $ command >> file 2>&1

#  stdin 和 stdout 都重定向。command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
$ command < file1 >file2


(4)Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

command << delimiter
    document
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:

  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
  • 开始的delimiter前后的空格会被忽略掉。

实例

# 在命令行中通过 wc -l 命令计算 Here Document 的行数:
$ wc -l << EOF
    欢迎来到
    菜鸟教程
    www.runoob.com
EOF
3          # 输出结果为 3 行

可以将 Here Document 用在脚本中,例如:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF

执行以上脚本,输出结果:

欢迎来到
菜鸟教程
www.runoob.com


(5)dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这里的 2> 之间不可以有空格,2> 是一体的时候才表示错误输出。


2>&1 的含义解释

参考:https://blog.csdn.net/zhaominpro/article/details/82630528

(1)在Linux系统中 0 1 2 是一个文件描述符

名称 代码 操作符 Java中表示 Linux 下文件描述符(Debian 为例)
标准输入(stdin) 0 < 或 << System.in /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0
标准输出(stdout) 1 \>, >>, 1> 或 1>> System.out /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0
标准错误输出(stderr) 2 2> 或 2>> System.err /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0

如上表所示,以下两条命令其实是等价的:

echo "hello" > t.log    《===》    echo "hello" 1> t.log


(2)关于 2>&1 的含义

  • 含义:将标准错误输出重定向到标准输出
  • 符号 >& 是一个整体,不可分开,分开后就不是上述含义了。

    2>1 的写法其实是将标准错误输出重定向到名为"1"的文件里去了。

  • 2> 之间不可以有空格,2> 是一体的时候才表示错误输出。写成 2&>1也是不可以的


(3)为什么 2>&1 一定要写到 >log 后面,才表示标准错误输出和标准输出都定向到log中?

一条shell命令如下:

nohup java -jar app.jar >log 2>&1 &
# 注:最后一个&表示把条命令放到后台执行

# 解析如下:(1 和 2 都理解是一个指针)
    1.本来 1 -----> 屏幕 (1指向屏幕)
    2.执行 >log 后, 1 -----> log (1指向log)
    3.执行 2>&1 后, 2 -----> 1(2指向1,而1指向log,因此2也指向了log)

# 命令结果:标准错误输出和标准输出都定向到log中

另一条shell命令如下:

nohup java -jar app.jar 2>&1 >log &

# 解析如下:
    1.本来 1 -----> 屏幕 (1指向屏幕)
    2.执行 2>&1 后, 2 -----> 1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
    3.执行 >log 后, 1 -----> log (1指向log,2还是指向屏幕)
    
# 命令结果不是我们想要的结果

简单测试如下:

// java代码如下:
public class Htest {
    public static void main(String[] args) {
        System.out.println("out1");
        System.err.println("error1");
    }
}


// javac编译后运行下面指令:
java Htest 2>&1 >log
    

// 终端上只显示输出了"error1",log文件中则只有"out1"


(4)>log 2>&1 的简写

有以下两种简写方式:

&>log    |    >&log

# 第一种简写方式完整示例:
nohup java -jar app.jar &>log &

上面两种简写方式都和 >log 2>&1 一个语义,没有任何区别,但是第一种方式是最佳选择,一般使用第一种。

seq:输出序列化的东西

seq: squeue 是一个序列的缩写,主要用来输出序列化的东西

# 用法:
seq [选项]... 尾数
# 或:
seq [选项]... 首数 尾数
# 或:以指定增量从首数开始打印数字到尾数
seq [选项]... 首数 增量 尾数

# 选项
-s, --separator=字符串        # 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width          # 在列前添加0 使得宽度相同【自动补位】
-f, --format=格式          # 使用 printf 样式的浮点格式
                            # 格式:%3g:表示宽度为3,不足用0补足;%前面还可以指定字符串
    --help                  # 显示此帮助信息并退出
    --version               # 显示版本信息并退出

示例

# 以空格作为分格,且输出单数
$ seq -s ' ' 10
1 2 3 4 5 6 7 8 9 10

# 默认补位操作
$ seq -w 8 10
08
09
10

# # 产生-2~10内的整数,增量为2
$ seq -2 2 2
-2
0
2

# 使用指定格式。宽度为3,不足用0补足。
$ seq -f 'dir%03g' 1 3
dir001
dir002
dir003
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
NoSQL Linux 网络安全
Linux安装Redis(详细教程)
Linux安装Redis(详细教程)
25 2
|
4天前
|
IDE Linux 开发工具
Linux 系统上安装
在Linux和Mac上安装Lua 5.3.0只需下载源码,解压,编译和安装。Windows用户可选择SciTE IDE或通过LuaForWindows在Github或Google Code下载安装。创建 HelloWorld.lua,使用`lua HelloWorld.lua`运行显示&quot;Hello World!&quot;。另可参考LuaDist官方推荐方式安装。
|
3天前
|
弹性计算 分布式计算 Hadoop
Linux(阿里云)安装Hadoop(详细教程+避坑)
Linux(阿里云)安装Hadoop(详细教程+避坑)
25 3
|
3天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
14 0
|
4天前
|
Shell Linux Perl
Linux|如何允许 awk 使用 Shell 变量
Linux|如何允许 awk 使用 Shell 变量
13 2
|
4天前
|
Ubuntu Linux Shell
minio服务端以Linux服务形式安装
minio服务端以Linux服务形式安装
20 6
|
4天前
|
缓存 监控 网络协议
Windows网络管理及诊断命令整理
Windows网络管理及诊断命令整理
8 0
|
4天前
|
关系型数据库 MySQL Linux
Linux下安装MySQL
Linux下安装MySQL
18 0
|
4天前
|
安全 Linux 网络安全
【操作系统】实验一 Linux操作系统安装
【操作系统】实验一 Linux操作系统安装
9 3
|
4天前
LabVIEWCompactRIO 开发指南18 使用网络流发送消息和命令
LabVIEWCompactRIO 开发指南18 使用网络流发送消息和命令
11 0