Linux命令

Table of Contents

1 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

2 ss

显示Socket状态

3 chsh

更改用户的默认shell。

sudo chsh -s /bin/zsh lu4nx

4 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

5 tail

打印文件尾部内容

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

6 tr

转换或删除字符

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

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

$ tr -d '\0' < /tmp/has_00 | hexdump
0000000 6261 0063
0000003

7 eval

将字符串交给shell再次扫描并执行,比如x文件的内容:

$ cat x
ls /etc

然后用eval可以让x里的内容再次执行:

eval $(cat x)

例,远程另外一台机器登录我的笔记本,无法ssh-add:

$ ssh-add
Could not open a connection to your authentication agent.

这个时候需要执行ssh-agent的内容:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-mVzghWGagC5W/agent.11859; export SSH_AUTH_SOCK;
SSH_AGENT_PID=11860; export SSH_AGENT_PID;
echo Agent pid 11860;

便可以用eval:

$ eval $(ssh-agent)
Agent pid 11864

8 xargs

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

以下是测试源文件test:

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

9 find

找出最近创建的文件

使用find命令可以找出最近创建的文件:

find ./ -mtime 0

参数mtime,后面跟数字n,表示最近n×24消失修改过的文件

查找SUID的程序

find 目录 -perm -4000

-perm指定权限位,如-perm -777

找出指定日期之后创建的文件

find . -name '*.doc' -newermt 2017-04-20

10 lsof

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

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

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

lsof 目录/文件名

查看进程使用了哪些文件

lsof -c 进程名

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

如果要按PID查看:

lsof -p PID

11 paste

按列合并两个文件

假如文件1:

1 2 3

文件2:

a b c

执行合并:

paste 1 2

输出:

a b c

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

lu4nx@lx:/tmp$ paste 1 2 -d\
1 a
2 b
3 c

12 nl

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

如:

lu4nx@lx:/tmp$ cat x
test1
test2
test3
lu4nx@lx:/tmp$ nl x
1  test1
2  test2
3  test3

13 shuf

随机显示文本某行

shuf 文件名 -n1

-n:随机显示1行

14 comm

对比两个已排序过的文件

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

comm file1 file2

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

另外有两个参数:

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

comm -12 file1 file2:显示file1和file2共同行

15 iconv

编码转换

-t 目标编码
-f 原编码

如:

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

16 import

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

import 文件名

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

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

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

17 zenity

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

#! /bin/bash

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

18 apt-file

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

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

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

apt-file search xxx

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

apt-file update

19 watch

周期性执行某个命令。

例,实时监控dmesg:

watch "dmesg | tail"

20 strings

打印文件中的可见字符。

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

21 pdfunite

合并PDF文件

pdfunite file1.pdf file2.pdf output.pdf

22 convert

格式转换

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

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

23 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