linux命令学习笔记

[TOC]

0. 前言

一篇关于linux简单命令的学习笔记。

在linux的/bin/目录下包含一些基础命令的可执行文件(二进制文件)。

以下命令格式中,略去命令选项。

1. 文件管理

cd

~ 到用户HOME目录
/ 到系统根目录
- 退到上一个进入的目录

ls

格式:
ls <选项> <目录>

主要选项:
-a 查看当前目录下所有文件和目录,包括隐藏文件
-A 同 -a ,但不列出 “.” (目前目录) 及 “..” (父目录)
-S 按文件大小排序列表
-l 使用长列表格式列出详细信息
-t 按文件的最后修改时间排序列表。
-c (1)与-lt一起用时按照存取时间来排序列表,并在列表中显示存取时间的值,其中存取时间是文件状态信息中的最后修改时间;(2)与-l一起用时按照文件名来排序列表,但在列表中显示存取时间。
-full-time 显示每个文件的完全日期和时间
-h 以人们易读的格式显示文件大小(“K”,”M”,”G”)
-i 显示文件的节点号
-r 反序列表
-R 递归显示子目录中的内容
-s 以磁盘块个数的形式显示每个文件的大小
-time=WORD 将WORD作为时间显示以代替文件的最后修改时间。

ls -ilh 后显示:

1
2
3
4
5
6
total 28K
658691 -rw-rw-r-- 1 test test 81 Dec 13 01:52 db_info
658248 drwxrwxr-x 3 test test 4.0K Dec 11 19:44 douNine
658064 drwxrwxr-x 5 test test 4.0K Dec 13 20:05 go
658315 -rw-rw-r-- 1 test test 9.0K Nov 28 22:33 hist
656748 drwxrwxr-x 2 test test 4.0K Dec 3 15:19 ziwen
  • 第一字段:inode(文件或目录索引点,相当于指向文件在磁盘中数据的指针)
  • 第二字段:文件种类(-表示正常文件,d表示目录,l表示链接文件)和权限(rwx,共9位,分别控制文件属主所属用户组以及其它用户的权限)
  • 第三字段:硬链接个数
  • 第四字段:文件属主
  • 第五字段:文件所归属的用户组
  • 第六字段:文件或目录的大小(字节)
  • 第七字段和第八字段:最后访问或修改时间
  • 第九字段:文件名或目录名

mkdir

创建一个目录

格式:
mkdir <dir>

主要选项:
-m 设置许可模式
-v 为每一个创建的目录显示一条消息

rmdir

删除一个空目录

格式:
rmdir <dir>

rm

删除(remove)

格式:
rm <选项> <文件或目录>

主要选项:
-i 以询问的方式删除
-f 强制删除
-r 递归删除,删目录时

rm -rf 强制递归删除过于暴力,且删除后还无法复原。因此,我常自定义删除文件/目录的命令,在~/.bashrc中添加:

1
2
3
4
5
6
7
8
9
10
alias rm='echo "please use trash"'
alias trash=trash
trash() {
mv $@ ~/.trash/
}
alias clearTrash=clearTrash
clearTrash() {
sudo /bin/rm -rf ~/.trash/*
}

mv

移动(move)

格式:
mv <文件A或目录A> <文件B或目录B>

说明:
该命令有重命名的作用,当xxB不存在时,会将xxA重命名为xxB

cp

复制(copy)

格式:
cp <文件A或目录A> <文件B或目录B>

pwd

显示当前绝对路径

cat

只读形式显示文件内容

格式:
cat <文件>

主要选项:
-b 计算所有非空输出行,开始为1。
-e 在每行末尾显示$符号。
-n 计算所有输出行,开始为1。
-s 将相连的多个空行用单一空行代替。

显示文件开头。

常用选项:

-n <count> == -<count> 显示前 count 行,默认为 10 。

常用:

  • head -20 file.log 显示前 20 行

tail

显示文件结尾。

常用选项:

-n <count> == -<count> 显示后 count 行,默认为 10 。
-f 不断获取文件新添加的数据。

常用:

tail -f log 查看不断更新的日志。

file

格式:
file <file/dir>

查看文件类型

more

分页显示文件的内容

格式:
more <file>

说明:
分页显示文件内容查看时:

  • 上下左右键进行翻阅
  • q键退出。

less

more命令的进阶版

说明:
less = more + vi
在分页查看文件内容时,还可以:

  • 使用/pattern从头向尾查找显示字符串
  • 使用?pattren从尾向头查找显示字符串

touch

新建文件

格式:
touch <文件>

chmod

修改文件权限。

在linux中,一个文件的权限范围有:

  • u:User,即文件或目录的拥有者。
  • g:Group,即文件或目录的所属群组。
  • o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。
  • a:All,即全部的用户,包含拥有者,所属群组以及其他用户。

而,文件的权限又分为:

  • r:读取权限,数字代号为 4
  • w:写入权限,数字代号为 2
  • x:执行或切换权限,数字代号为 1
  • -:不具任何权限,数字代号为 0

查看文件权限用 ls -l 命令,就会显示每个文件u,g,o范围的权限。

修改一个文件的权限大致有两种方法,如:

chmod u+x <file> file 的 u(即文件所拥有者)
新增 x(执行权限),u-x 即对该范围取消 x 权限

chmod 755 <file> 表示对file的 u,g,o 范围分别赋予 7,5,5 权限。7=1+2+4,指rwx权限;5=1+4,指r-x权限;同理,还有 0,2,4,6 等权限。

理解

为何任意一个小于7数字就能表示一种三个权限的组合呢?我猜想是因为这是个三位的二进制数。x是第一位,w是第二位,r是第三位,0和1表示权限关和开。所以,7的二进制为111,表示三个权限都开启;5的二进制为101,表示rx权限开启。

chown

修改文件/目录的属主。

chown root test/test/目录的属主改为root

chgrp

修改文件/目录的属组。

chgrp root test/test/目录的属组改为root

wc

依次显示文件的行数,单词数和字符数

格式:
wc <文件>

主要选项:
-l 只显示行数
-w 只显示单词数
-c 只显示字符数

find

查找文件或目录

主要选项:
-name <文件> 匹配要名字相同的文件,要找的文件名字包括在引号中,可以使用通配符(*和?)
-perm <模式> 匹配所有模式为指定数字型模式值的文件。不仅仅是读,写和执行,所有模式都必须匹配。如果在模式前是负号(-),表示采用除这个模式外的所有模式。
-user <用户号> 匹配所有用户序列号是前面所指定的用户序列号的文件,可以是数字型的值或用户登录名。
-atime n 匹配所有在前n天内访问过的文件。
-mtime n 匹配所有在前n天内修改过的文件。
-newer <文件> 匹配所有修改时间比file文件更新的文件。
-size n 匹配所有大小为n 块的文件(若k在n后,则为1K字节块)。
-print 显示整个文件路径和名称。一般来说,如果没有这个选项,find命令进行所要求的搜索是不会显示结果的。

示例:
find ~/go/src/ -name "beego" -print 通过文件名查找,并打印出文件或目录的路径
find ~/go/src/ -name "bb*" -print 根据部分文件名查找。会匹配名字为 bba、bbhj、bbac 等文件或目录。
find /etc –size 2500b –print 根据文件的特征查询。例如,知道一个文件尺寸小于为2500bytes

注解

通配符又称多义符。在描述文件时,有时在文件名部分用到一些通配符,以加强命令的功能。与正则表达式很像。

  • ?:表示该位置可以是一个任意字符。
  • *:表示该位置可以是零个或多个任意字符。
  • [charset]:可选择charset集中的任何单个字符。例如:ls name[1-5].png 会列出name1.png、name2.png…

tar

加密解密,此处参照大神博客

常用选项:

  • c Create archive.tar from files. 压缩到 .tar
  • x Extract all files from archive.tar. 从 .tar 解压
  • f 指定解/压缩文件名
  • v 显示解压过程
  • z 解/压缩 .tar.gz 结尾的压缩包
  • C dir/ 解压到指定目录

常用示例:

  • tar -cvf archive.tar file/ 压缩成 tar
  • tar -czvf archive.tar.gz file/ 压缩成 tar.gz
  • tar -xvf archive.tar 解压 tar
  • tar -xzvf archive.tar.gz 解压 tar.gz

ln

对文件或目录建立链接(其中的软链接,类似于Windows的快捷方式)。

分类:硬链接(Hard Link),符号链接(Symbolic Link)。

硬链接

默认情况下,ln产生硬链接。

建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。有硬链接关系的两个文件的inode值相同。

当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。可以这么理解,互为硬链接关系的文件,他们好象是克隆体,他们的属性几乎是完全一样;硬链接关系的文件是无法区别的。

格式:
ln <选项> <源目录/文件> <目标目录/文件>

说明:
ln a.c ~/ 如果最后一参数是一个已存在的目录,那么ln命令就在目录下创建与各个目标相连的链接,而且名字也与目标相同
ln a.c ~/b.c 如果给出了两个文件名,那么命令生成一个从第二个文件指向第一个文件的链接。
ln a.c 如果只给出了一个目标,ln就在当前目录下生成一个指向目标的链接。

软链接

软链接也叫符号链接,其实就是快捷方式。

格式:
ln -s 源文文件或目录 目标文件或目录

示例:
$ ln -s /mnt/d/my_code/ ~/link_my_code 软链接一个目录到另一个目录下时,用绝对路径

$ ln -s my_code/ ~/link_my_code 这样是错误的,因为~/下没有my_code这个目录

区别

1)硬链接相当于拷贝了指向文件数据的“指针”(文件索引结点信息)过来。而软链接记住的,是文件索引结点所在的目录,似乎是一个“指针”的指针。

2)若一个文件有多个硬链接,删除其中一个文件后,文件数据其实并未删除,还可以通过其它硬链接找到这个文件,只是文件的硬链接个数会减一。而软链接,删除源文件后,软链接就不可用了,此处很像window的快捷方式。

注:不管软硬链接,修改一个文件,另一个文件也会被修改。

2.进程与内存管理

ps

查看进程(process)

主要选项:
-A 显示所有进程(等价于-e)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。
-p pid 进程使用cpu的时间
-u uid 或 username 选择有效的用户id或者是用户名,如 -u test 查看test用户
-g gid 或 groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如: U test
-f 全部列出,通常和其他选项联用。如:ps -fa 或 ps -fx
-l 长格式(有F,wchan,C 等字段)
-j 操作格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)
e 命令之后显示环境(如:ps -d e; ps -a e)
h 不显示第一行

常用:

  • ps -aux,执行后,显示的头部如下:
1
2
3
用户  进程id  CPU使用率  内存使用率  状态  开始日期  开始时间  命令

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

其中STAT有以下几种状态:

  • D: 不可中断的静止
  • R: 正在执行中
  • S: 静止状态
  • T: 暂停执行
  • Z: 不存在但暂时无法消除
  • W: 没有足够的记忆体分页可分配
  • <: 高优先序的行程
  • N: 低优先序的行程
  • L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)

kill

kill -stop pid 发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。

kill -cont pid 发送SIGCONT (19,18,25)重新开始一个停止的进程。

kill -kill pid 发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。

kill -9 -1 终止你拥有的全部进程。

top

动态显示任务管理器。

free

查看内存使用情况。

-h 自动转换单位,显示 B K M 等。

常用:

  • free -h,输出示例如下:
1
2
3
4
$ free -h
total used free shared buff/cache available
Mem: 62G 20G 13G 42M 28G 41G
Swap: 0B 0B 0B

3. 用户管理

linux多用户概念

root 权限最高的主用户,HOME目录为 /root/

其它(如test) 权限较小的用户,HOME目录一般为 /home/test/

~ 用户HOME目录。 cd ~cd 回到HOME目录,cd ~/go/src/ 去HOME目录下的go/src/目录

/ 系统根目录。 /bin/ 为系统根目录下的bin目录

su

切换用户

格式:
su <name> 切换到某个用户,没加用户名则默认登录root用户。

useradd

创建新用户

格式:
useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name

主要选项:
-c:加上备注文字,备注文字保存在passwd的备注栏中。
-d:指定用户登入时的主目录。默认值/home/<用户名>
-D:变更预设值。
-e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1.
-g:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users。
-G:指定用户所属的附加群组。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
-s:指定用户登入后所使用的shell。默认值为/bin/bash。
-u:指定用户ID号。该值在系统中必须是唯一的。0~499默认是保留给系统用户账号使用的,所以该值必须大于499。

说明:
用 useradd 创建账号之后,再使用passwd设定账号的密码
用户的信息都保存在 /etc/passwd 文件中。
用户组的信息都保存在 /etc/group 文件中。

示例:
useradd -m test 创建test用户并自动建立用户登录目录

passwd

格式:
passwd <name> 为name用户创建密码

赋予用户管理员权限

修改 /etc/sudoers 文件如下:

1
2
3
# User privilege specification
root ALL=(ALL:ALL) ALL
<name> ALL=(ALL:ALL) ALL

注意: 该文件是只读权限,需要先给文件增加写权限,再进行修改。

1
2
root@iZuf697sx3nms8k9zb2kw4Z:~# chmod a+w /etc/sudoers
root@iZuf697sx3nms8k9zb2kw4Z:~# vim /etc/sudoers

修改完后还要将该文件改回只读权限,不然用户使用sudo时会报错:

1
2
3
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

userdel

格式:
userdel <name> 删除名为name的用户

4.网络管理

netstat

主要选项:

-t 仅显示TCP相关选项
-u 仅显示UDP相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字。直接通过ip地址,而不通过域名服务器
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
-a 显示所有连接中socket

常用:

netstat -tnlp

ssh

远程连接。

一般默认安装,若不存在,则服务端需安装 openssh-server ,客户端需安装 openssh-clients

ssh 服务名为 sshd ,可通过 service sshd start 启动。

常用选项:

-p 指定端口。
-i 指定密钥。

示例:

  • ssh root@192.168.0.20 口令验证(密码)或密钥免密验证
  • ssh -i test.key test@192.168.0.12 密钥登录指定密钥

若采用密钥登录且登录时不需指定密钥,则需:

  1. ssh-keygen 生成公密钥,默认在 ~/.ssh 下生成公钥 id_ras.pub 和密钥 id_rsa ,可重命名。

  2. ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip 将公钥传到服务器。

  3. 登录时指定密钥,或在 ~/.ssh/config 中指定,如下:

    1
    2
    3
    4
    Host 192.168.0.20
    Port 22
    User root
    IdentityFile ~/.ssh/root.key

scp

远程文件传输(上传/下载)。

常用选项:

-p 指定端口。
-i 指定密钥。
-r 递归文件夹,用于传文件。

常用:

  • scp -r dir/ root@ip:~/dir 上传文件夹。
  • scp root@ip:~/file file 下载文件。

curl

用于网络请求。

常用选项:

-X <method> 指定请求方法 GET POST 等。
-d <data> 参数用于发送 POST 请求的数据体,上传文件内的数据时,使用 @file
-H <header> 参数添加 HTTP 请求的标头。
-x <proxy> 参数指定 HTTP 请求的代理。
-v 参数输出通信的整个过程,用于调试。
-o <output file> 参数将服务器的回应保存成文件

常用:

  • POST 发送 json 数据:
1
curl -d '{"name": 6}' -X POST 192.168.0.1:8080/report

参考:

5.磁盘管理

blkid

查看Linux系统上所有设备与分区(可以理解为每个硬盘)的文件系统类型、UUID、LABEL标签、挂载目录等信息。

换而言之,就是查看系统中的如磁盘、CD/DVD、U盘之类的文件(linux将所有储存的东西都称为文件)位置及信息。

mount

将设备挂载到Linux上。

格式:
mount [-t vfstype] [-o options] <device> <dir>

主要选项:

1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。
常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs

2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集

3.device指明要挂载的设备(是一个文件),设备文件通常在/dev/目录下。比如插入的CD/DVD会是/dev/sr0文件。

4.dir设备在系统上的挂载点(是一个目录)。

示例:mount /dev/sr0 /data 将设备挂载到 /data 目录下。

umount

取消挂载,类似于弹出u盘

格式:

umount <dir>

dir是挂载点目录

du

说明:

显示文件和目录的磁盘使用空间大小。

命令选项:

-a 显示目录中文件的大小,单位KB。

-b 显示目录中文件的大小,以字节byte为单位。

-c 显示目录中文件的大小,同时也显示总和;单位KB。

-k\-m 显示目录中文件的大小,-k 单位KB,-m 单位MB。

-s 仅显示目录的总值,单位KB。

-h 以K  M  G为单位显示,提高可读性。

-x 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。

-L 显示选项中所指定符号链接的源文件大小。

-S 显示个别目录的大小时,并不含其子目录的大小。

-X 在<文件>指定目录或文件。

--exclude=<目录或文件> 略过指定的目录或文件。

-D 显示指定符号链接的源文件大小。

-H\--si 与-h选项相同,但是K,M,G是以1000为换算单位。

-l 重复计算硬件链接的文件。

常用:

1
2
# 显示当前目录下各文件/文件夹的大小
du -sh *

df

显示系统上可使用的磁盘空间。

主要选项:

-h 以容易阅读的方式显示
-T 输出时显示文件系统类型

常用:

1
df -hT

fdisk

划分磁盘分区。

常用:

  • 查看所有磁盘信息:
1
fdisk -l
  • 对 /dev/sdb 磁盘进行分区操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ fdisk /dev/sdb
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

对于 fdisk 各子命令的使用,请参考:df、du、fdisk:Linux磁盘管理命令整理

6. 文本管理

grep

查找字符串。在一个或多个输入文件中查找含有与指定模式(正则表达式)相匹配的字符串的行。

格式:
grep <string> <dir>

主要选项:

-c 对匹配的行计数
-l 只显示包含匹配的文件的文件名
-h 抑制包含匹配文件的文件名的显示
-n 每个匹配行只按照相对的行号显示
-i 产生不区分大小写的匹配,缺省状态是区分大小写
-v 列出不匹配的行
-E 使用正则表达式
-o 只打印匹配的部分
-P/--perl-regexp 高级正则。Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.

示例:

  • grep magic /usr/src/* 在‘/usr/src’目录下搜索带字符串‘magic’的文件。

  • cat hello.c | grep hello 在 cat hello.c 后显示出来的内容中,查找hello字符串

  • blkid | grep -oP '(?<=UUID=").*?(?=")' 获取磁盘的UUID

echo

将文本原样(参数)输出。

示例:

1
2
$ echo hello world
hello world

-n 默认情况下,echo输出的文本末尾会有一个回车符,-n 可以取消末尾的回车符。
-e 默认情况下,echo参数加引号(双引号和单引号)会让特殊字符变成普通字符,-e会解释引号里面的特殊字符(比如换行符\n)。

1
2
3
$ echo -e "Hello\nWorld"
Hello
World

sed

强大的文本编辑工具,可以使用模式匹配进行替换编辑,与 vim 类似,但 sed 使用的是流式编辑

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。

常用选项:

-i 直接修改源文件,慎用。

常用示例:

  • sed "s/my/your/g" pets.txt

详情参考:

awk

一个强大的文本文件处理分析工具,和 sed 命令类似,awk 命令也是逐行扫描文件。

经典格式:

1
awk '<pattern>{<action>}' <file>

pattern模式对每一行进行匹配,若匹配成功则对当前行执行action操作。模式和操作都是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。

常用选项:

-F 指定分割符,默认分割符为空格Tab,awk 会根据分隔符将每行分成多个字段。示例:-F : 指定冒号、-F '[;:]' 指定多个。

常用内建变量:

  • $0 当前记录(这个变量中存放着整个行的内容)
  • $1~$n 当前记录的第n个字段,字段间由FS分隔
  • FS 输入字段分隔符,默认是空格或Tab
  • NF 当前记录中的字段个数,就是有多少列
  • NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
  • FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
  • RS 输入的记录分隔符,默认为换行符
  • OFS 输出字段分隔符,默认也是空格
  • ORS 输出的记录分隔符,默认为换行符
  • FILENAME 当前输入文件的名字

常用示例:

  • 输出第1列和第4列

    1
    2
    3
    4
    5
    6
    $ netstat -tnlp | awk '{print $1, $4}'
    Proto Local
    tcp 0.0.0.0:29503
    tcp 127.0.0.1:1988
    tcp 0.0.0.0:8648
    tcp 0.0.0.0:8649
  • 条件判断、输出表头、格式化输出

    1
    2
    3
    4
    5
    6
    $ netstat -tnlp | awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}'
    Local Address Foreign
    0.0.0.0:29503 0.0.0.0:* LISTEN
    127.0.0.1:1988 0.0.0.0:* LISTEN
    0.0.0.0:8648 0.0.0.0:* LISTEN
    0.0.0.0:8649 0.0.0.0:* LISTEN
  • 指定分隔符和输出分隔符:

    1
    2
    3
    $ awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
    root 0 /root
    bin 1 /bin
  • 模式匹配(正则),格式如/模式/~表示匹配正则、!~表示不匹配正则:

    1
    2
    3
    4
    $ netstat -tnlp | awk '$6~/LIS*/ || NR==1 {print NR,$4,$5,$6}' netstat.txt
    1 Local Address Foreign
    2 0.0.0.0:29503 0.0.0.0:* LISTEN
    3 127.0.0.1:1988 0.0.0.0:* LISTEN
  • 可自定义变量、BEGIN{} 指定读取文件前运行的动作、END{} 指定读取文件后运行的动作,如下示例统计文件的行数:

    1
    awk 'BEGIN{count=0}{count=count+1}END{print count}' /etc/passwd

详情参考:

tr

将输入字符串中,属于集合一的字符都替换成集合二中对应位置的字符,并输出。

1
tr [OPTION] SET1 [SET2]

常用选项:

-d 删除集合一中的字符
-s 删除所有连续重复出现的属于集合一的字符,只保留第一个
-c 用集合一的补集替换此集合,通常 -cd 连用

示例:

  • 小写转大写:
1
2
tr [:lower:] [:upper:] "adasfa"
tr a-z A-Z "asdafa"
  • 删除非数字:
1
echo asdf121341hjhio9h0 | tr -cd 0-9 # 12134190
  • 将多个空格转换为一个减号:
1
echo "20       1         3" | tr -s " " "-" # 20-1-3

7. 杂项

man

查看命令介绍。

history

显示历史的输入指令。

bc

进入计算器模式,输入 quit 退出。

alias

为命令取别名。例如: 执行 alias look='ll -a' ,即使得命令 look 等价于 ll -a 。当然,这样的别名意义不大。

我们可以用 unalias look 来删除这个别名。

我们也可以在bash配置文件添加这个自定义的命令(别名),vim ~/.bashrcvim /etc/bashrc ,一个相对于当前用户,一个相对于全体用户。

在**~/.bashrc中加入:alias serverOpen="python -m SimpleHTTPServer $1"。保存退出后,再执行 source ~/.bashrc 使得该配置生效**。这样之后,我们就可以用 serverOpen 8080 开启一个简单的8080端口的web服务器,不加端口则默认是8000端口。

whereis

whereis命令只能用于搜索程序名,而且只搜索二进制文件(选项-b)、man说明文件(选项-m)和源代码文件(选项-s)。如果省略选项,则返回所有信息。

主要选项:
-b 搜索二进制文件
-m man说明文件
-s 源码文件

示例:

1
2
3
4
$ whereis vim
vim: /usr/bin/vim.basic /usr/bin/vim.tiny /usr/bin/vim /etc/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
$ whereis python
python: /usr/bin/python2.7 /usr/bin/python3.5 /usr/bin/python3.5m /usr/bin/python /usr/lib/python2.7 /usr/lib/python3.5 /etc/python2.7 /etc/python3.5 /etc/python /usr/local/lib/python2.7 /usr/local/lib/python3.5 /usr/share/python /usr/share/man/man1/python.1.gz

which

which命令是查找命令是否存在,以及命令的存放位置在哪儿。

示例:

1
2
3
4
$ which vim
/usr/bin/vim
$ which python
/usr/bin/python

whoami

显示当前用户的用户名