文件传输
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 包自动解决依赖
当生产环境由于安全原因处于断网状态时,要安装 linux 软件只能通过本地源的方式:
- 外网主机通过 downloadonly 或 yumdownloade 插件获取该软件及其依赖包,供本地源使用。
- 使用 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:文本和数据进行处理的编程语言
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