Skip to content

Instantly share code, notes, and snippets.

@dlutcat
Last active December 12, 2015 07:48
LinuxTips历史发布归档
######
# 本归档每周末收录当周的Tips
######
# 以root身份执行上一条命令
$ sudo!!
# 返回用户主目录
$ cd
# 返回前一次所在目录
$ cd -
# Python自带的简易httpserver,可以serve当前目录。方便多平台的文件分享。
$ python -m SimpleHTTPServer
# 清空文件内容
$ > file.txt
# 快速在终端查看ASCII码表
$ man ascii
# 获取本机的外网IP,该命令需要联网。感谢 http://ifconfig.me/
$ curl ifconfig.me
# 剪切从光标到行首/粘贴上一次剪切的内容
Ctrl + u/y
# 移动光标到行首/行尾/前(右)一位/前(左)一位
Ctrl + a/e/f/b
# 搜索历史命令
Ctrl + r
# 查看所有监听的端口,以及相关的进程id和名字
$ sudo netstat -tlnp
# 当需要在终端输入较长文本的时候,
# 可以调出环境变量中$EDITOR中指定的编辑器进行编辑,
# 保存并关闭编辑器后文本内容则会传给终端执行
Ctrl-x e (同时摁下)
# 清空终端
Ctrl + l
# 随机生成16位的字符串,可以作为密码
$ cat /dev/urandom | base64 | head -c 16
# 在当前目录及其子目录的所有.py文件中搜索含有TODO的行
$ find . -name '*.py' | xargs grep -r 'TODO'
# 快捷查看内核/操作系统/CPU信息
$ uname -a
# 显示系统最后重启的历史记录
$ last reboot
# 某任务前后台执行切换
$ ping www.kantuban.com # Ctrl + z后台运行上述命令
$ fg # 把后台运行的命令调出到前台
$ jobs -l # 查看后台进程列表
# 查看硬件设备信息
$ dmesg
# 查看文件行数
$ cat test.txt | wc -l
# 递归移除指定目录中的pyc文件:
$ find target_dir -name '*.pyc' | xargs rm -vf
# 打印file.txt的前7行
$ sed 7q file.txt
# ^find^replace技巧:把前一次命令中的find替换为replace执行,比如下面我们要重启mysqld这个服务:
# 关闭服务mysqld
$ /etc/init.d/mysqld stop
# 启动服务mysqld
$ ^stop^start
# 我们都知道用 cat 可以查看文件内容,其实cat还有个参数-v可以查看文件中的不可见字符:
$ cat -v file.txt
############
# AWK 系列 #
############
# 示例文件
$ cat file.txt
id name
1 China
2 Japan
3 Korea
# awk - 1: 打印指定列
$ awk '{print $1}' file.txt
id
1
2
3
# 'NR!=1'表示花括号里的操作对象排除第一行
$ awk 'NR!=1{print $1}' file.txt
1
2
3
# 示例文件
$ cat file.txt
id,name
1,China
2,Japan
3,Korea
# awk - 3: awk默认的分隔符是空格,可以使用-F参数来指定分隔符
$ awk -F "," '{print $1}' file.txt
id
1
2
3
# awk - 4: 给awk程序传变量,有2种方法。
# 方法1 - 用 -v 参数传入
$ awk -v val=1 -F, '{print $1 ">" val}' file.txt
id>1
1>1
2>1
3>1
# 方法2 - 在文件名前以k=v关键字参数的形式传入
$ awk -v '{print $1">"val}' val=1 file.txt
id>1
1>1
2>1
3>1
# awk - 5: 利用awk做文件内容匹配
$ cat file.txt
id,name
1,China
2,Japan
3,Korea
#### (1) 在file.txt中匹配含有'na'的行
# $0: 匹配范围为所有列。$0表示所有列,$1表示第一列,以此类推。
# ~ :表示模糊匹配,按照‘/正则表达式/’进行匹配。
# print:表示打印整行,其实是省略了$0。如果想打印第一列可以写成 {print $1}。
$ awk '$0 ~ /na/{print}' file.txt
id,name
1,China
$ awk -F , '$2 ~ /na/{print $2}' file.txt
name
China
# 由于awk默认打印整行,默认正则匹配,且默认匹配范围是所有列,所以也可以简写为:
$ awk /na/ file.txt
id,name
1,China
#### (2) 精准匹配,注意用'=='取代了'~'
$ awk -F , '$2 == "China" {print $2}' file.txt
China
#### awk - 6: 组合条件匹配:并,或,否
$ cat file.txt
id,name
1,China
2,Chinaaaa
3,Japan
4,Korea
# (1) 并:&&
$ awk -F , '$2 ~ /na/ && $1 > 1 {print}' file.txt
id,name # 字母大于数字,所以此行会被匹配出来
2,Chinaaaa
# (2) 或:||
$ awk -F , '$2 ~ /Ja/ || $1 == 4 {print}' file.txt
3,Japan
4,Korea
# (3) 否:!~,!=
$ awk -F , '$1 !~ 2 {print}' file.txt
id,name
1,China
3,Japan
4,Korea
#### awk - 7:列求和
$ cat file.txt
1,China
2,Chinaaaa
3,Japan
4,Korea
# 第一列求和,即1 + 2 + 3 + 4
# x+=$1表示:x = 0; x = x + $1
# END表示循环到文件尾
$ awk -F , '{x+=$1}END{print x}' file.txt
10
# awk - 8 利用awk进行分组求和
$ cat file.txt
Item1,200
Item2,500
Item3,900
Item2,800
Item1,600
# 分别求Item1, Item2, Item3的和
# a[$1]类似JavaScript中的hash,Python中的dict,以$1为key, $2的累积为value
$ awk -F , '{a[$1] += $2}END{for(i in a) print i "," a[i]}' file.txt
Item1,800
Item2,1300
Item3,900
# awk - 9 插入列
$ cat file.txt
Item1,200
Item2,500
Item3,900
Item2,800
Item1,600
# 在第一列前面插入一列
$ awk -F , '{$1=++i FS $1;}1' OFS=, file.txt
1,Item1,200
2,Item2,500
3,Item3,900
4,Item2,800
5,Item1,600
# 在最后一列后面插入一列
awk -F , '{$(NF+1)=++i;}1' OFS=, file.txt
Item1,200,1
Item2,500,2
Item3,900,3
Item2,800,4
Item1,600,5
# 在最后一列前面插入一列
$ awk -F , '{$NF=++i FS $NF;}1' OFS=, file.txt
Item1,1,200
Item2,2,500
Item3,3,900
Item2,4,800
Item1,5,600
## awk - 10 更新列
$ cat file.txt
Item1,200
Item2,500
Item3,900
Item2,800
Item1,600
# 第二列加1000
$ awk -F , '{$2+=1000}'1 OFS=, file.txt
Item1,1200
Item2,1500
Item3,1900
Item2,1800
Item1,1600
# 将第一列转为大写字母
$ awk -F , '{$1=toupper($1)}'1 OFS=, file.txt
ITEM1,200
ITEM2,500
ITEM3,900
ITEM2,800
ITEM1,600
## awk - 11 按照某一列来分组拆分到多个文件
$ cat file.txt
Item1,200
Item2,500
Item3,900
Item2,800
Item1,600
# 拆分成Item1, Item2, Item3三个文件
$ awk -F , '{print > $1}' file.txt
$ cat Item1
Item1,200
Item1,600
$ cat Item2
Item2,500
Item2,800
$ cat Item3
Item3,900
###############
# SED 系列 #
###############
### sed - 1:插入行
$ cat file.txt
Hilesh, 1001
Bharti, 1002
Aparna, 1003
Harshal, 1004
Keyur, 1005
# 在第一行之前插入一行'----------'
# 操作符 i : insert 或 include 的简写。
$ sed '1i ------------' file.txt
------------
Hilesh, 1001
Bharti, 1002
Aparna, 1003
Harshal, 1004
Keyur, 1005
# 在最后一行之后插入一行‘-----------’
# 操作符 a : after的简写
$ sed '$a ------------' file.txt
Hilesh, 1001
Bharti, 1002
Aparna, 1003
Harshal, 1004
Keyur, 1005
------------
### sed - 2:在指定行前或后插入行
$ cat file.txt
Hilesh, 1001
Bharti, 1002
Aparna, 1003
Harshal, 1004
Keyur, 1005
# 在Aparna所在行的下一行插入一行'Linuxtips, 2013'
$ sed '/Aparna/a Linuxtips, 2013' file.txt
Hilesh, 1001
Bharti, 1002
Aparna, 1003
Linuxtips, 2013
Harshal, 1004
Keyur, 1005
# 在Aparna所在行的前一行插入一行'Linuxtips, 2013'
$ sed '/Aparna/i Linuxtips, 2013' file.txt
Hilesh, 1001
Bharti, 1002
Linuxtips, 2013
Aparna, 1003
Harshal, 1004
Keyur, 1005
### sed - 3:字符串替换之二
$ cat file.txt
apple
orange
banana
pappaya
# 替换第3行的a为A
$ sed '3s/a/A/g' file.txt
apple
orange
bAnAnA
pappaya
# 替换第1行到第3行的a为A
$ sed '1, 3s/a/A/g' file.txt
Apple
orAnge
bAnAnA
pappaya
### sed - 4:字符串替换之三:多次替换
$ cat file.txt
apple
orange
banana
pappaya
# 把所有a替换为A,p替换成P
$ sed 's/a/A/g; s/p/P/g' file.txt
APPle
orAnge
bAnAnA
PAPPAyA
# 也可以写成这样
$ sed -e 's/a/A/g' -e 's/p/P/g' file.txt
APPle
orAnge
bAnAnA
PAPPAyA
### sed - 5:文件拼接
$ cat file1.txt
1apple
1banana
1mango
$ cat file2.txt
2orange
2strawberry
# 将file2.txt插入file1.txt每一行之间
# r - read
$ sed 'r file2.txt' file1.txt
1apple
2orange
2strawberry
1banana
2orange
2strawberry
1mango
2orange
2strawberry
# 将file2.txt插在file1.txt的第一行之后
$ sed '1r file2.txt' file1.txt
1apple
2orange
2strawberry
1banana
1mango
# 将file2.txt插在file1.txt中含有banana的那行之后
$ sed '/banana/r file2.txt' file1.txt
1apple
1banana
2orange
2strawberry
1mango
### sed - 6:删除行
$ cat file.txt
apple
orange
banana
pappaya
# 删除第一行
$ sed '1d' file.txt
orange
banana
pappaya
# 删除最后一行
$ sed '$d' file.txt
apple
orange
banana
# 删除1至3行
$ sed '1,3d' file.txt
pappaya
###############
# 网页存档页:
# https://gist.github.com/dlutcat/4739126
###############
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment