Shell 应用程序

包管理

apt

  • install
  • update
  • remove
  • autoremove
  • clean

rpm

yum

说明

  • yum在不使用yum makecache手动检查源配置文件时,可能 很长时间都不会更新cache,也就无法发现软件仓库的更新 (当然,可能和仓库类型有关,使用ISO镜像作为仓库时如此, 即使不挂载镜像,yum在执行其他操作也不会发现有个仓库无法 连接)

dpkg

zypper

pacman

库、依赖

ldconfig

创建、查看动态链接库缓存

  • 根据/etc/ld.so.conf文件中包含路径,搜索动态链接库文件 ,创建缓存文件/etc/ld.so.cache

  • 默认包含/lib/lib64/usr/lib/usr/lib64, 优先级逐渐降低,且低于/etc/ld.so.conf中路径

参数

  • 生成动态链接库缓存,并打印至标准输出
  • -v/--verbose:详细版
  • -n:仅扫描命令行指定目录
  • -N:不更新缓存
  • -X:不更新文件链接
  • -p:查看当前缓存中库文件
  • -f CONF:指定配置文件,默认/etc/ld.so.conf
  • -C CACHE:指定生成缓存文件
  • -r ROOT:指定执行根目录,默认/(调用chroot实现)
  • -l:专家模式,手动设置
  • -f Format/--format=Format:缓存文件格式
    • ld:老格式
    • new:新格式
    • compat:兼容格式

ldd

查看程序所需共享库的bash脚本

  • 通过设置一系列环境变量,如LD_TRACE_LOADED_OBJECTSLD_WARNLD_BIND_NOWLD_LIBRARY_VERSIONLD_VERBOSE

  • LD_TRACE_LOAD_OBJECTS环境变量不空时,任何可执行程序 运行时只显示模块的依赖,且程序不真正执行

  • 实质上是通过ld-linux.so实现

    1
    2
    3
    $ /lib/ld-linux.so* --list exe
    $ ldd exe
    // 二者等价
    • ld-linux.so*参见cppc/func_lib.md

参数

  • -v:详细模式
  • -u:打印未使用的直接依赖
  • -d:执行重定位,报告任何丢失对象
  • -r:执行数据、函数重定位,报告任何丢失的对象、函数

打印

  • 第1列:程序动态链接库依赖
  • 第2列:系统提供的与程序需要的库所对应的库
  • 第3列:库加载的开始地址
  • 首行、尾行可能是两个由kernel向所有进程都注入的库

strings

查看系统glibc支持的版本

objdump

查看目标文件的动态符号引用表

Shell 系统监控

系统监控

scar

收集、报告、保存系统活动信息

iostat

报告CUP统计数据,设备、分区输入/输出信息

iotop

I/O监控

mpstat

报告CPU相关统计数据

vmstat

报告虚拟内存统计

tload

加载显示系统平均负载、指定tty终端平均负载

time

显示资源资源使用时间

uptime

显示系统已运行时间

ipcs

提供IPC设施信息

ipcrm

删除消息队列、信号量集、共享内存ID

lslk

列出本地锁

Linux 归档、压缩

归档、压缩

tar

多个文件保存进行归档、压缩

gzip

压缩、解压缩gzip文件

gunzip

解压缩gzip文件

zcmp

调用diff比较gzip压缩文件

unzip

解压缩zip文件

zip

压缩zip文件

zcat

查看zip压缩文件

zless

查看zip压缩文件

zipinfo

列出zip文件相关详细信息

zipsplit

拆分zip文件

zipgrep

在zip压缩文件中搜索指定字符串、模式

zmore

查看gzip/zip/compress压缩文件

rpm2cpio

将rpm包转变为cpio格式文件,然后可以用cpio解压

1
$ rpm2cpio rpm_pkg | cpio -div

Shell 任务

定时任务

atq

列出用户等待执行的作业

atrm

删除用户等待执行的作业

watch

定期执行程序

at

设置在某个时间执行任务

1
2
3
4
5
6
7
at now+2minutes/ now+5hours
# 从现在开始计时
at 5:30pm/ 17:30 [today]
# 当前时间
at 17:30 7.11.2018/ 17:30 11/7/2018/ 17:30 Nov 7
# 指定日期时间
# 输入命令之后,`<c-d>`退出编辑,任务保存

crontab

针对用户维护的/var/spool/cron/crontabs/user_name文件,其中 保存了cron调度的内容(根据用户名标识)

  • -e:编辑
  • -l:显示
  • -r:删除

任务计划格式见文件部分

任务、作业

Crontab文件

/var/spool/cron/crontabs/user_name

使用用户名标识的每个用户的定时任务计划文件,文件中每行为一个 cron调度内容(也可以使用crontab -e直接编辑)

  • 共6个字段,前5个字段为执行调度时间分配

    • 分钟、小时(24)、日期(31)、月份(12)、星期
    • *表示每个当前时间
    • -时间区间
    • ,时间分隔
    • [range]/[n]:范围内每隔多久执行一次,范围为*可省
  • 最后字段为调度内容

  • 1
    2
    3
    4
    3,15 8-11 */2 * * command
    # 每隔两天的8-11点第3、15分执行
    3,15 8-11 * * 1 command
    # 每个星期一的上午8-11点的第3、15分钟执行

/etc/crontabs

系统级crontab文件,类似于用户crontab文件,只是多一个用户名 字段位于第6个

服务

系统服务

  • 服务systemctl脚本目录优先级从低到高

    • [/usr]/lib/systemd/system:系统、应用默认存放位置 ,随系统、应用更新会改变

    • /etc/systemd/system推荐在此自定义配置,避免 被更新覆盖

      1
      2
      .include /lib/systemd/system/<service_name>.service
      # customized changes
    • /run/systemd/system:进程运行时创动态创建服务文件 目录,仅修改程序运行时参数才会修改

  • 自定义系统服务方法

    • 创建<service_name>.service文件,其中写入配置
    • 创建<service_name>.service.d目录,其中新建.conf 文件写入配置
  • 系统服务控制命令systemctl参见linux/shell/cmd_sysctl

.service

<some_name>.service:服务配置unit文件

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[Unit]					# 包含对服务的说明
Description= # 服务简单描述
Documentation= # 服务文档
Requires= # 依赖unit,未启动则当前unit启动失败
Wants= # 配合unit,不影响当前unit启动
BindsTo= # 类似`Requires`,若其退出则当前unit
# 退出
Before= # 若该字段指定unit要启动,则必须在
# 当前unit之后启动
After= # 若该字段指定unit要启动,则必须在
# 当前unit之前启动
Conflicts= # 冲突unit
Condition= # 条件,否则无法启动
Assert= # 必须条件,否则启动失败


[Service] # 服务具体运行参数设置,仅
# *service unit*有该字段
Type= # 服务启动类型
PIDFile= # 存放PID文件路径
RemainAfterExit= # 进程退出后是否认为服务仍处于激活

ExecStartPre= # 服务启动前执行的命令
ExecStartPost= # 服务启动后执行的命令
ExecStart= # 服务具体执行、重启、停止命令
ExecReload=
ExecStop=

Restart= # 重启当前服务的情况
RestartSec= # 自动重启当前服务间隔秒数
TimeoutSec= # 停止当前服务之前等待秒数

PrivateTmp= # 是否给服务分配临时空间
KillSignal=SIGTERM
KillMode=mixed

Environmen= # 指定环境变量

[Install]
WantedBy= # unit所属的target,`enable`至相应
# target
RequiredBy= # unit被需求的target
Alias= # unit启动别名
Also= # `enable`当前unit时,同时被`enable`
# 的unit
  • Type:服务启动类型

    • simple:默认,执行ExecStart启动主进程

      • Systemd认为服务立即启动
      • 适合服务在前台持续运行
      • 服务进程不会fork
      • 若服务要启动其他服务,不应应该使用此类型启动,
    • forking:以fork方式从父进程创建子进程,然后父进程 立刻退出

      • 父进程退出后Systemd才认为服务启动成功
      • 适合常规守护进程(服务在后台运行)
      • 启动同时需要指定PIDFile=,以便systemd能跟踪 服务主进程
    • oneshot:一次性进程

      • Systemd等待当前服务退出才继续执行
      • 适合只执行一项任务、随后立即退出的服务
      • 可能需要同时设置RemainAfterExit=yes,使得 systemd在服务进程推出后仍然认为服务处于激活状态
    • notify:同simple

      • 但服务就绪后向Systemd发送信号
    • idle:其他任务执行完毕才会开始服务

    • dbus:通过D-Bus启动服务

      • 指定的BusName出现在DBus系统总线上时,Systemd 即认为服务就绪
  • WantedBy:服务安装的用户模式,即希望使用服务的用户

    • multi-user.target:允许多用户使用服务

.target

<some_name>.target:可以理解为系统的“状态点”

  • target通常包含多个unit

    • 即包含需要启动的服务的组
    • 方便启动一组unit
  • 启动target即意味将系统置于某个状态点

  • target可以和传统init启动模式中RunLevel相对应

    • 但RunLevel互斥,不能同时启动

    |RunLevel|Target| |——-|——-| |0|runlevel0.targetpoweroff.target| |1|runlevel1.targetrescue.target| |2|runlevel2.targetmulti-user.target| |3|runlevel3.targetmulti-user.target| |4|runlevel4.targetmulti-user.target| |5|runlevel5.targetgraphical.target| |6|runlevel6.targetreboot.target|

  • enable设置某个服务自启动,就是在服务配置.serviceWantedByRequiredBy指明的target注册

    • WantedBy向target对应目录中 /etc/systemd/system/<target_name>.target.wants 添加符号链接
    • RequiredBy向target对应目录中 /etc/systemd/system/<target_name>.target.required 添加符号链接
    • systemctl disable <unit>就是移除对应symlink

.socket

日志

/etc/systemd/journal.conf

Systemd日志配置文件

Systemd(服务)

  • Systemd作为新系统管理器,替代service更加强大

    • 支持服务并行启动,提高效率
    • 具有日志管理、快照备份和恢复、挂载点管理
    • 包括一组命令
  • Systemd可以管理所有系统资源,不同资源统称为Unit

    • service unit:系统服务
    • target unit:多个unit构成的组
    • devie unit:硬件设备
    • mount unit:文件系统挂载点
    • automount unit:自动挂载点
    • path unit:文件、路径
    • scope unit:不是由Systemd启动外部进程
    • slice unit:进程组
    • snapshot unit:Systemd快照,可以切换某个快照
    • socket unit:进程间通信socket
    • swap unit:swap文件
    • timer unit:定时器
  • unit配置文件状态(无法反映unit是否运行)

    • enabled:已建立启动链接
    • diabled:未建立启动链接
    • static:配置文件没有[Install]部分,只能作为 其他unit配置文件依赖,不能独立注册
    • masked:被禁止建立启动链接
  • systemd进程ID为1,掌管所有进程
  • unit配置文件参见linux/shell/config_files

systemctl

  • systemctl通过d-bus和systemd交流,在docker和wsl中可能 没有systemd-daemon,此命令可能不能使用,使用service 代替

查看服务、系统状态

  • status <unit>:查看系统、unit(服务)状态
    • -H <host>:查看远程主机unit状态
  • show <unit>:查看unit底层参数
    • -p <attr>:查看某个具体属性参数
  • 三个查询状态的简单方法,方便脚本使用
    • is-active <serivce>
    • is-failed <serivce>
    • is-enabled <serivce>
  • reset-failed <unit>:清除错误状态

  • list-units:列出所有已加载unit

  • list-unit-files:列出所有系统中unit配置文件、状态
    • --type=:指定特定类型文件
    • --status=:指定特定状态文件
  • list-dependencies <unit>:查看依赖关系
    • -all:展开target类型

状态点/启动级别

  • get-default:查看默认target
  • set-default <target>:设置默认target
  • isolate <target>:切换target,其他target的unit将 被停止

设置服务、系统

  • start <service>:启动服务
  • stop <service>:关闭服务
  • enable <service>:开机自启动服务

    • 行为参见linux/shell/config_files
  • disable <service>:关闭开机自启动服务

    • enable启动后的服务仅仅disable不会立刻停止服务
  • kill <service>:杀死服务的所有子进程
  • mask <service>:禁用服务
    • 无法通过startrestart启动服务
    • 可以防止服务被其他服务间接启动
  • umask <service>:启用已禁用服务
  • daemon-reload:重新读取所有服务项
    • 修改、删除、添加服务项后执行该命令
  • poweroff:关机
  • reboot:重启
  • rescue:进入rescue模式

配置文件

  • cat <service_name>.service:查看Unit定义文件
  • edit <service_name>.service:编辑Unit定义文件
  • reload <service_name>.service:重新加载Unit定义文件

journalctl

journalctl:统一管理所有日志:内核日志、应用日志

  • -k:仅内核日志
  • --since:指定日志时间
  • -n:指定查看日志行数
  • -f:最新日志
  • _PID=:进程日志
  • _UID=:用户日志
  • -u:unit日志
  • -p:日志有限集
    • emerg:0
    • alert:1
    • crit:2
    • err:3
    • warning:4
    • notice:5
    • info:6
    • debug:7
  • --nopager:非分页输出
  • -o:日志输出格式
    • json
    • json-pretty
  • --disk-usage:日志占用空间
  • --vacuum-size=:指定日志占用最大空间
  • --vacuum-time=:指定日志保持时间

systemd-analyze

systemd-analyze:查看系统启动耗时

  • blame:查看各项服务启动耗时
  • critical-chain:瀑布状启动过程流

hostnamectl

hostnamectl:查看主机当前信息

  • set-hostname <hostname>:设置主机名称

localectl

localctl:查看本地化设置

  • set-locale LANG=en_GB.utf8
  • set-keymap en_GB

timedatectl

timedatectl:查看当前时区设置

  • list-timezones:显示所有可用时区
  • set-timezone America/New_York
  • set-time YYYY-MM-DD
  • set-time HH:MM:SS

loginctl

loginctl:查看当前登陆用户

  • list-sessions:列出当前session
  • list-users:列出当前登陆用户
  • show-user <user>:显示用户信息

service

控制系统服务

Shell 用户配置

用户、组

用户信息

/etc/passwd

用户属性

  • 用户名
  • 口令:在/etc/passwd文件中以x显示
  • user-id:UID,用户标识
    • linux事实上不直接处理用户名,只识别UID
    • UID对用户是唯一的
  • group-id:GID,用户的默认组标识
    • 用户可以隶属多个不同的组,但是只有一个默认组,即用户 创建文件默认隶属的组
  • 描述:用户描述
  • 用户主目录:用户登陆目录
  • 登陆shell:用户登陆系统使用的shell
    • 缺省为空,可能是/bin/sh

/etc/shadow

用户口令属性

  • 用户名
  • 加密的密码
  • 自1/1/1970起,密码被修改的天数
  • 密码将被允许修改之前的天数(0为在任何时候可修改)
  • 系统强制用户修改为新密码之前的天数(1永远不能修改)
  • 提前警告用户密码过期前天数(-1无警告)
  • 禁用用户账户在密码过期后天数(-1永不禁用)
  • 用户被禁用天数(-1被启用)

/etc/group

群组账号信息文件

  • 群组名
  • 密码:以x显示
  • 群组ID(GID)
    • 系统群组:安装Linux以及部分服务型程序时自动设置的 群组,GID<500
    • 私人组群:由root新建的群组,默认GID>500
  • 附加用户列表

/etc/gshadow

群组口令信息文件

/etc/sudoers

sudo配置文件

  • 根据配置文件说明取消注释即可赋予用户、组sudo权限

用户配置文件

  • login-shell:用户登陆(创建session)时的shell模式,该 模式下shell会自动执行profile文件
  • subshell:用户登陆后载入的shell的模式,该模式下shell会 自动执行rc文件

profile

-一般在login-shell模式会执行一次,从名称看起来更像是 用户配置

  • 全局、被所有用户默认执行的文件在/etc目录下,用户个人 profile在用户目录

  • ^profile$是所有类型shell(bash、zsh、ash、csh)都会 执行

  • 不同类型的shell可能有其特定的profile文件,如: /etc/bash_profile~/.bash_profile,不过不常见 (可以理解,毕竟是用户配置

  • 有的发行版本(ubuntu)还有有/etc/profile.d文件夹,在 /etc/profile中会设置执行其中的配置文件

rc

rc应该是run command的简称,在每次subshell模式会执行,从 名称看起来更像是shell配置(很多应用配置文件rc结尾)

  • 全局、被所有用户执行的文件在/etc目录下,用户个人rc 则在用户目录

  • 应该是因为rc本来就是对shell的配置文件,所以是不存在 通用的^rc$配置的,最常用的bash对应就是~/.bashrc~/bash.bashrc

总结

  • 其实rc也会在用户登陆时执行

    • login-shell会立刻载入subshell?
    • profile里设置了立刻调用?
  • 应该写在profile里的配置

    • shell关系不大、更像是用户配置,如:特定应用环境变量
    • 不需要、不能重复执行,因为rc在用户登录时已经执行 过一次,launch subshell时会重复执行,如: export PATH=$PATH:xxxx/bin/
  • 应该写在rc里的配置

    • 和shell关系紧密的shell配值,如:alias
    • 在用户登陆后会该边,需要在每次launch subshell时执行 的配置
  • 配置文件执行顺序

    • 没有一个确定顺序,不同的linux发行版本有不同的设置, 有的还会在脚本中显式写明相互调用,如:/etc/profile 中调用/etc/bashrc~/.bashrc调用/etc/bashrc
    • 但是可以确认的是/etc/profile一般是第一个被调用, ~/.xxxxrc/etc/xxxxxrc中的一个最后调用
  • 还有一些其他配置文件

    • ~/.bash_logout:退出bash shell时执行
  • 对于wsl,可能是因为将用户登陆windows视为create session, ~/.profile好像是不会执行的

/etc/environment

系统在登陆时读取第一个文件

  • 用于所有为所有进程设置环境变量
  • 不是执行此文件中的命令,而是根据KEY=VALUE模式的 代码,如:PATH=$PATH:/path/to/bin

用户命令

用户类型

  • 超级用户:root用户
  • 系统用户:与系统服务相关的用户,安装软件包时创建
  • 普通用户:root用户创建,权限有限

显示登陆用户

w

详细查询已登录当前计算机用户

who

显示已登录当前计算机用户简单信息

logname

显示当前用户登陆名称

users

用单独一行显示当前登陆用户

last

显示近期用户登陆情况

lasttb

列出登陆系统失败用户信息

lastlog

查看用户上次登陆信息

用户、用户组

newusers

更新、批量创建新用户

lnewusers

从标准输入中读取数据创建用户

userdel

删除用户账户

groupdel

删除用户组

passwd

设置、修改用户密码

chpassws

成批修改用户口令

change

更改用户密码到期信息

chsh

更改用户账户shell类型

pwck

校验/etc/passwd/etc/shadow文件是否合法、完整

grpck

验证用户组文件/etc/grous//etc/gshadow完整性

newgrp

将用户账户以另一个组群身份进行登陆

finger

用户信息查找

groups

显示指定用户的组群成员身份

id

显示用户uid及用户所属组群gid

su

切换值其他用户账户登陆

sudo

以superuser用户执行命令

  • Archlinux中需要自行安装
  • 配置文件为/etc/sudoers

useradd/adduser

创建用户账户(adduseruseradd命令的符号链接)

  • -c:用户描述
  • -m:创建用户目录
  • -d:用户起始目录
  • -g:指定用户所属组
  • -n:取消建立以用户为名称的群组
  • -u:指定用户ID
  • -s:指定用户登录shell
    • 缺省为空,默认值应该是/bin/sh,很多发行版会设置 其为/bin/bash
    • 查看$SHELL环境变量查看当前shell
    • 文件/etc/shells包含支持shell类型

usermod

修改用户

  • -e:账户有效期限
  • -f:用户密码过期后关闭账号天数
  • -g:用户所属组
  • -G:用户所属附加组
  • -l:用户账号名称
  • -L:锁定用户账号密码
  • -U:解除密码锁定

groupadd

新建群组

  • -g:强制把某个ID分配给已经存在的用户组,必须唯一、非负
  • -p:用户组密码
  • -r:创建系统用户组

groupmod

  • -g:设置GID
  • -o:允许多个用户组使用同一个GID
  • -n:设置用户组名

Linux 系统启动

登陆、退出、关机、重启

login

登陆系统

logout

退出shell

exit

退出shell(常用)

rlogin

远程登陆服务器

poweroff

关闭系统,并将关闭记录写入/var/log/wtmp日志文件

ctrlaltdel

强制或安全重启服务器

shutdown

关闭系统

halt

关闭系统

reboot

重启系统

init 0/6

关机/重启

Shell 环境变量

环境

export

显示、设置环境变量,使其可在shell子系统中使用

  • 设置环境变量直接$ ENV=value即可,但是此环境变量 不能在子shell中使用,只有$ export ENV导出后才可
  • -f:变量名称为函数名称
  • -n:取消导出变量,原shell仍可用
  • -p:列出所有shell赋予的环境变量

系统环境变量

NAME

  • PATH:用户命令查找目录
  • HOME:用户主工作目录
  • SHELL:用户使用shell
  • LOGNAME:用户登录名
  • LANG/LANGUAGE:语言设置
  • MAIL:用户邮件存储目录
  • PS1:命令基本提示符
  • PS2:命令附属提示符
  • HISTSIZE:保存历史命令记录条数
  • HOSTNAME:主机名称
  • /etc/passwd/etc/hostname等文件中设置各用户部分 默认值,缺省随系统改变

PATH

C PATH

  • LIBRARY_PATH:程序编译时,动态链接库查找路径
  • LD_LIBRARAY_PATH:程序加载/运行时,动态链接库查找路径
  • 动态链接库寻找由/lib/ld.so实现,缺省包含/usr/lib/usr/lib64
    • 建议使用/etc/ld.so.conf配置替代LD_LIBRARY_PATH, 或在编译时使用-R<path>指定
    • 手动添加动态链接库至/lib/usr/lib等中时,可能 需要调用ldconfig生成cache,否则无法找到

Shell 常用工具

获取命令系统帮助

help

重看内部shell命令帮助信息(常用)

man

显示在线帮助手册(常用)

info

info格式的帮助文档

打印、日期、时间

echo

输出至标准输出

env

打印当前所有环境变量

cal

显示日历信息

date

date:显示、设置系统日期时间

1
date -d <time> "+<format>"
  • -d:指定时间,缺省今天
  • +:指定输出格式
    • %Y-%m-%d %h-%M-%S:年月日时(24时)分秒
    • %a/%A:星期缩写、完整
    • %b/%B:月份缩写、完整
    • %DMM/DD/YY
    • %FYYYY-MM-DD

hwclock

查看、设置硬件时钟

clockdiff

主机直接测量时钟差

rdate

通过网络获取时间

sleep

暂停指定时间

数值计算

bc

任意精度计算器

expr

将表达式值打印到标准输出,注意转义

Shell 本地化

本地化

字体

fc-

  • fc-list:列出系统已安装字体

    1
    2
    # 仅展示中文字体
    $ fc-list :lang=zh
  • fc-cache:创建字体信息缓存文件

  • mkfontdir/mkfontscale:创建字体文件索引

  • 字体安装

    • 将字体文件复制至字体文件夹
      • $HOME/.fonts
      • /usr/share/fonts
    • fc-cache 更新缓存信息

文件、目录

显示文本文件

cat

  • cat:显示文本文件内容
  • zcat:查看压缩文件内容

more

  • more:单向分页显示文本文件
  • zmore:单向分页显式压缩文本文件

less

  • less:双向分页显示文本文件内容
  • zless:双向分页显式压缩文件内容

head:显示文件指定前若干行

tail

tail:实现文件指定后若干行

nl

nl:显示文件行号、内容

文件处理

sort

对文件中数据排序

uniq

删除文件中重复行

cut

从文件的每行中输出之一的字节、字符、字段

diff

逐行比较两个文本文件

diff3

逐行比较三个文件

cmp

按字节比较两个文件

tr

从标准输入中替换、缩减、删除字符

split

将输入文件分割成固定大小的块

tee

将标准输入复制到指定温婉

expand

将文件中tab转换为空格输出到标准输出

1
$ expand -n 4 file_name

nano

awk

一门模式匹配的编程语言

  • 主要功能是匹配文本并处理
  • 同时还有一些编程语言才有的语法:函数、分支循环语句、变量 等等
  • 使用awk可以
    • 将文本文件视为字段、记录组成的文本数据库
    • 操作文本数据库时能够使用变量
    • 能够使用数学运算和字符串操作
    • 能够使用常见地编程结构,如:条件、分支循环
    • 能够格式化输出
    • 能够自定以函数
    • 能够在awk脚本中执行linux命令
    • 能够处理linux命令的输出结果

命令行语法

1
2
$ awk [-F ERE] [-v assignment] ... program [argument...]
$ awk [-F ERE] -f progfile ... [-v assignment] ... [argument ...]

sed

sed:非交互式、面向字符流的编辑器

  • sed也是默认从stdin读取输入、输出至stdout,除非 参数filename被指定,会从指定文件获取输入,但是注意 sed是面向字符流的编辑器,所以输入、输出文件不能是同一个

  • sed按行处理文本数据,每次处理一行在行尾添加换行符

1
$ sed [-hnV] [-e<script>][-f<script-file>][infile]

参数

  • -e<script>/--expression=<script>:以指定script 处理infile(默认参数)

    • 默认不带参数即为-e
  • -f<script-file>/--file=<script-file>:以指定的script 文件处理输入文本文件

    • 文件内容为sed的动作
  • -i:直接修改原文件

  • -n/--quiet:仅显示script处理后结果

  • -h/--help:帮助

  • -V/--version:版本信息

动作

  • [n]a\string:行添加,在n行后添加新行string
  • [n]i\string:行插入
  • [n]c\string:行替换
  • [n,m]d:删除,删除n-m
  • [start[,end]]p:打印数据
  • [start[,end]]s/expr/ctt[/g]:正则替换

高级语法

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ sed '2anewline' ka.file
$ sed '2a newline' ka.file
$ sed 2anewline ka.file
$ sed 2a newline ka.file
# 在第2行添加新行`newline`

$ sed 2,$d ka.file
# 删除2至最后行

$ sed 2s/old/new ka.file
# 替换第2行的`old`为`new`

$ nl ka.file | sed 7,9p
# 打印7-9行

$ sed ":a;N;s/\n//g;ta" a.txt
# 替换换行符

查找字符串、文件

grep

查找符合条件的字符串

egrep

在每个文件或标准输入中查找模式

find

列出文件系统内符合条件的文件

whereis

插卡指定文件、命令、手册页位置

whatis

在whatis数据库中搜索特定命令

which

显示可执行命令路径

type

输出命令信息

  • 可以用于判断命令是否为内置命令