Linux 命令

Table of Contents

1 bc

四则运算

➜  echo 1+1 | bc
2
➜  echo 1*0 | bc # 需要用引号
zsh: no matches found: 1*0
➜  echo '1*0' | bc
0
➜  echo '4/2' | bc
2
➜  echo '4-2' | bc
2

二进制计算

obase=2
ibase=2
01+10
11

2 curl

下载文件

curl -o [filename] http://xxx

3 date

日期字符串和时间戳之间户转:

$ date +%s # 当前时间戳
1461552157
$ date -d'2016-04-25 14:23' +%s
1461565380
$ date -d @1461551881 # 时间戳转字符串
2016年 04月 25日 星期一 10:38:01 CST
$ date -d @1461551881 +'%Y-%m-%d' # 自定义格式
2016-04-25

日期计算:

$ date -d '-1years'
2015年 04月 25日 星期六 10:56:09 CST
$ date -d '-1days'
2016年 04月 24日 星期日 10:56:13 CST
$ date -d '-1months'
2016年 03月 25日 星期五 10:56:16 CST

遍历某段时期的日期:

start_date=20151101
end_date=20171126

while [[ $start_date < $end_date ]]
do
    echo $start_date
    start_date=$(date -d "+1 month ${start_date}" +%Y%m%d)
done

4 ss

显示 socket 状态

5 chsh

更改用户的默认 shell。

sudo chsh -s /bin/zsh lu4nx

6 time

time 命令可以统计一个程序的执行总时间、在用户以及内核模式的执行总时间

如:

$ time python test_case.py

Ran 1 test in 2.326s

OK

0m2.372s
0m0.044s
0m0.008s

这里可以看到执行完这个 Python 脚本所花的总时间,user 和 sys 分别是用户态和内核态执行的总时间,user+sys 的时间与 real 的时间相差较大的话,说明I/O阻塞所花费的时间比较长。sysuserreal

7 tail

打印文件尾部内容

# 打印文件倒数 10 行
$ tail -10 /etc/passwd
# 跳过文件前 10 行的内容(从第 11 行开始打印)
$ tail -n +10 /etc/passwd

8 tr

转换、替换和删除字符

# 删除文件中的空字符(NULL)

# 文件内容如下:
# $ hexdump /tmp/has_00
# 0000000 6261 6300
# 0000004

$ tr -d '\0' < /tmp/has_00 | hexdump
0000000 6261 0063
0000003
# 按字符集替换
$ echo 'luanx' | tr '[al]' '[41]'
1u4nx

9 xargs

  • 它用于格式化数据流
  • 它可以转变数据流内容成程序参数

以下是测试源文件 test:

1
2 3
4 5 6
  1. 默认上数据流变成行
cat test|xargs:
1 2 3 4 5 6
  • 参数 -d 还可以指定分隔符
  • 参数 -n 指定每行最多列数
[email protected]:/tmp$ cat test | xargs -n 2
1 2
3 4
5 6
  1. 递归删除文件
find . -name '.svn' | xargs rm -rf

10 lsof

查看进程打开的 socket 这次遇到 urllib2 的一个坑,文档说不用手动关闭,而 close 方法却是个 pass

在多线程+高并发请求网页时候,会阻塞死,如果用 lsof -i tcp:80 可以看到大量的连接请求。

查看文件/目录被哪些进程操作

lsof 目录/文件名

查看进程使用了哪些文件

lsof -c [进程名]

如果要查看多个进程,使用多个 -c 参数就可以了。

如果要按 PID 查看:

lsof -p [PID]

查看进程占用了哪些端口

lsof -Pl +M -p [PID]

或者根据端口号查找进程:

lsof -Pl +M -i4 -i6 | grep [端口号]

11 paste

按列合并两个文件

假如文件1:

1 2 3

文件2:

a b c

执行合并:

paste 1 2

输出:

a b c

paste 默认使用 Tab 作为分割符号,参数 -d 后面跟字符自定义分隔符。使用空格话,需要转义空格字符,如:

[email protected]:/tmp$ paste 1 2 -d\
1 a
2 b
3 c

12 pr

在文本顶部加上title和页码,便于打印。

13 nl

nl 命令可以给文本每行开头加入行号

如:

[email protected]:/tmp$ cat x
test1
test2
test3
[email protected]:/tmp$ nl x
1  test1
2  test2
3  test3

14 shuf

随机显示文本某行

shuf 文件名 -n1

-n:随机显示1行

15 comm

对比两个已排序过的文件

对比两个都已排序过的文件

comm file1 file2

结果分成 3 行,第一行是文件 1 中出现过的行,第二行是文件 2 出项过的行,第三行是文件 1 和文件 2 共同出项过的。

另外有两个参数:

  • 1 不显示第一个文件出现过的
  • 2 不显示第二个文件出现过的
  • 3 不显示共同部分

comm -12 file1 file2:显示 file1 和 file2 共同行,即求两个数据集的交集。

16 iconv

编码转换

-t 目标编码
-f 原编码

如:

iconv -t utf8 -f gbk index.html > index.htm

17 import

import 是一个命令行版的屏幕截图工具。

import 文件名

截图后自动生成文件名,并保存到 home 目录中:

#!/bin/sh
filename=date +%Y%m%d%H%M%S
savepath=$HOME

exec import $savepath'/'$filename'.jpg'

18 zenity

使用 zenity 命令,可以弹出一个提示框,提示的文本内容可以自定义。如下例子是一个提示是否关机或重启的脚本:

#! /bin/bash

case $1 in
"down")
zenity --question --text "关机?" && sudo shutdown -h now
;;
"reboot")
zenity --question --text "重启?" && sudo shutdown -r now
;;
esac

19 apt-file

今天源码编译了 Apache,编译中没出问题。但运行时提示无法加载 xxx.so 库。说明 Apache 源码不依赖于它。

同日下午,编译 pypy 的时候,遇到 C 源码中找不到某头文件的问题。

知文件名不知包名,这种情况屡见。可用 apt-file 命令搜索某文件在哪些包中有:

apt-file search xxx

第一次使用 apt-file,需更新它的数据库:

apt-file update

20 watch

周期性执行某个命令。

例,实时监控 dmesg:

watch "dmesg | tail"

21 strings

打印文件中的可见字符。

上次遇到 Nginx 配置文件误丢,但 Nginx 还在运行,可用 gcore 命令将进程数据 dump 出来,再用 strings 把内存中的配置信息找出。

22 pdfunite

合并 PDF 文件

pdfunite file1.pdf file2.pdf output.pdf

23 convert

格式转换

例,合并多张图片到一个 PDF 文件:

convert 1.jpg 2.jpg 3.jpg out.pdf

24 rename

常用于批量重命名文件。不同的发行版 rename 命令版本不一样,有些是 C 版本,有些是 Perl 版本。

Fedora 默认是 C 版本的,Ubuntu 默认是 Perl 版的。

C 版本的 rename 接受三个参数:

rename 要修改的字符串 替换后的字符串 文件列表

例,将图“1.jpg、图2.jpg…”重命名为“1.jpg、2.jpg…”:

$ rename '图_' '' *.jpg

Perl 版的 rename 可直接写正则表达式,例如某目录下有以下文件:

$ ls
2016-08-01  2016-08-02  2016-08-03

将它们批量重命名为“yyyyMMdd”格式:

rename 's/\-//g' 2016*

结果如下:

$ ls
20160801  20160802  20160803