linuxCommands1
…
alias
alias
命令用于设置别名。通常用于在 Bash 设置文件中,设置别名。
1 | alias dockerlogin='ssh www-data@adnan.local -p2222' |
awk
awk
是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。
它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk
可能是最方便的工具。
awk
其实不仅仅是工具软件,还是一种编程语言。不过,这里只介绍它的命令行用法,对于大多数场合,应该足够用了。
基本用法
awk
的基本用法就是下面的形式。
1 | # 格式 |
上面示例中,demo.txt
是awk
所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0
。其中,print
是打印命令,$0
代表当前行,因此上面命令的执行结果,就是把每一行原样打印出来。
下面,我们先用标准输入(stdin)演示上面这个例子。
1 | $ echo 'this is a test' | awk '{print $0}' |
上面代码中,print $0
就是把标准输入this is a test
,重新打印了一遍。
awk
会根据空格和制表符,将每一行分成若干字段,依次用$1
、$2
、$3
代表第一个字段、第二个字段、第三个字段等等。
1 | $ echo 'this is a test' | awk '{print $3}' |
上面代码中,$3
代表this is a test
的第三个字段a
。
下面,为了便于举例,我们把/etc/passwd
文件保存成demo.txt
。
1 | root:x:0:0:root:/root:/usr/bin/zsh |
这个文件的字段分隔符是冒号(:
),所以要用-F
参数指定分隔符为冒号。然后,才能提取到它的第一个字段。
1 | $ awk -F ':' '{ print $1 }' demo.txt |
变量
除了$ + 数字
表示某个字段,awk
还提供其他一些变量。
变量NF
表示当前行有多少个字段,因此$NF
就代表最后一个字段。
1 | $ echo 'this is a test' | awk '{print $NF}' |
$(NF-1)
代表倒数第二个字段。
1 | $ awk -F ':' '{print $1, $(NF-1)}' demo.txt |
上面代码中,print
命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。
变量NR
表示当前处理的是第几行。
1 | $ awk -F ':' '{print NR ") " $1}' demo.txt |
上面代码中,print
命令里面,如果原样输出字符,要放在双引号里面。
awk
的其他内置变量如下。
FILENAME
:当前文件名FS
:字段分隔符,默认是空格和制表符。RS
:行分隔符,用于分割每一行,默认是换行符。OFS
:输出字段的分隔符,用于打印时分隔字段,默认为空格。ORS
:输出记录的分隔符,用于打印时分隔记录,默认为换行符。OFMT
:数字输出的格式,默认为%.6g
。
函数
awk
还提供了一些内置函数,方便对原始数据的处理。
函数toupper()
用于将字符转为大写。
1 | $ awk -F ':' '{ print toupper($1) }' demo.txt |
上面代码中,第一个字段输出时都变成了大写。
其他常用函数如下。
tolower()
:字符转为小写。length()
:返回字符串长度。substr()
:返回子字符串。sin()
:正弦。cos()
:余弦。sqrt()
:平方根。rand()
:随机数。
awk
内置函数的完整列表,可以查看手册。
条件
awk
允许指定输出条件,只输出符合条件的行。
输出条件要写在动作的前面。
1 | $ awk '条件 动作' 文件名 |
请看下面的例子。
1 | $ awk -F ':' '/usr/ {print $1}' demo.txt |
上面代码中,print
命令前面是一个正则表达式,只输出包含usr
的行。
下面的例子只输出奇数行,以及输出第三行以后的行。
1 | # 输出奇数行 |
下面的例子输出第一个字段等于指定值的行。
1 | $ awk -F ':' '$1 == "root" {print $1}' demo.txt |
if 语句
awk
提供了if
结构,用于编写复杂的条件。
1 | $ awk -F ':' '{if ($1 > "m") print $1}' demo.txt |
上面代码输出第一个字段的第一个字符大于m
的行。
if
结构还可以指定else
部分。
1 | $ awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt |
参考链接
- An Awk tutorial by Example, Greg Grothaus
- 30 Examples for Awk Command in Text Processing, Mokhtar Ebrahim
cal
cal
命令显示本月的日历。
1 | $ cal |
cat
cat
命令用于显示一个文本文件的内容。
cat - >> filename
用于向一个现有文件的尾部追加内容。
clear
clear
命令用来清除当前屏幕的显示,运行后会只留下一个提示符。
1 | $ clear |
cp 命令
cp
命令用于复制文件。
参数
-u
参数只复制那些目标目录里面还不存在的文件,以及那些虽然存在、但是比源目录对应文件更陈旧的文件。
cut
cut
命令用于在命令行输出文本文件的指定位置的内容。
它的使用格式如下。
1 | $ cut OPTION [FILE] |
如果没有指定文件名,将读取标准输入。
-b
参数用来指定读取的字节。
1 | # 输出前三个字节 |
-c
参数用来指定读取的字符,用法与-b
一样。有的字符是多字节字符,这时候就应该用-c
代替-b
。
-d
参数用来指定分隔符,默认分隔符为制表符。
-f
参数用来指定字段。
1 | # 指定每一行的分隔符为逗号, |
date
date
命令显示当前的日期和时间。
1 | $ date |
dd
dd
命令用于复制磁盘或文件系统。
复制磁盘
1 | $ dd if=/dev/sda of=/dev/sdb |
上面命令表示将/dev/sda
磁盘复制到/dev/sdb
设备。参数if
表示来源地,of
表示目的地。
除了复制,dd
还允许将磁盘做成一个镜像文件。
1 | $ dd if=/dev/sda of=/home/username/sdadisk.img |
dd
还可以复制单个分区。
1 | $ dd if=/dev/sda2 of=/home/username/partition2.img bs=4096 |
上面命令中,参数bs
表示单次拷贝的字节数(bytes)。
要将镜像文件复原,也很简单。
1 | $ dd if=sdadisk.img of=/dev/sdb |
清除数据
dd
也可以用于清除磁盘数据。
1 | # 磁盘数据写满 0 |
监控进展
磁盘的复制通常需要很久,为了监控进展,可以使用 Pipe Viewer 工具软件。如果没有安装这个软件,可以使用下面的命令安装。
1 | $ sudo apt install pv |
然后,来源地和目的地之间插入广告,就可以看到进展了。
1 | $ dd if=/dev/urandom | pv | dd of=/dev/sda1 |
参考链接
- David Clinton, How to use dd in Linux without destroying your disk
df
df
命令显示磁盘信息。
du
du
命令显示某个文件或目录的磁盘使用量。
1 | $ du filename |
-h
参数将返回的大小显示为人类可读的格式,即显示单位为 K、M、G 等。
-s
参数表示总结(summarize)。
-x
参数表示不显示不在当前分区的目录,通常会忽略/dev
、/proc
、/sys
等目录。
-c
参数表示显示当前目录总共占用的空间大小。
1 | # 显示根目录下各级目录占用的空间大小 |
--exclude
参数用于排除某些目录或文件。
1 | $ sudo du -shxc /* --exclude=proc |
--max-depth
参数用于设定目录大小统计到第几层。如果设为-–max-depth=0
,那么等同于-s
参数。
1 | $ sudo du /home/ -hc --max-depth=2 |
egrep
egrep
命令用于显示匹配正则模式的行,与grep -E
命令等价。
下面是example.txt
文件的内容。
1 | Lorem ipsum |
egrep
命令显示包括Lorem
或dolor
的行。
1 | $ egrep '(Lorem|dolor)' example.txt |
export
export
命令用于向子Shell输出变量。
1 | $ export hotellogs="/workspace/hotel-api/storage/logs" |
然后执行下面的命令,新建一个子 Shell。
1 | $ bash |
上面命令的执行结果会进入hotellogs
变量指向的目录。
export
命令还可以显示所有环境变量。
1 | $ export |
如果想查看单个变量,使用echo $VARIABLE_NAME
。
1 | $ echo $SHELL |