linux-hacks(奇技淫巧)

CD 相关

  1. CDPATH变量的设置,可以作为所有目录前缀
  2. $OLDPWD上一层目录
  3. dirs pushd popd 可以操作目录栈
  4. cd - 快速回到上一工作目录
  5. shopt bash的配置项配置命令 Mac不支持

基本命令

grep

  1. grep查找命令比较强大尤其是支持正则表达式
  2. -v 反向查找,排除符合的
  3. -c 显示匹配到的行数
  4. -i 忽略大小写
  5. -r 递归搜索
  6. -l 只显示匹配的文件名
  7. -E 扩展模式,后面接正则表达式
  8. -n 显示行号
  9. grep '^$' file_name 匹配空行
  10. grep "^[0-9]\{1,5\}" file_name 99999以内的数字
  11. grep -i "\bthe\b" file_name \b是单词边界 匹配含有the的
  12. grep -iw "is" file_name 单词级别的匹配,“this”不会被匹配到
  13. -A n -B n -C n把匹配到的地方前后周围的几行也打印出来,获取上下文环境

find

  1. mdfind 是OSX的命令,功能比较强大 效率也比较高,是spotlight文件查找的终端版本
  2. find . -name '*.log' 查找log后缀的文件
  3. find . -type f -size +20 查找20K以上的文件
  4. find . -mtime +60 查找60天前修改的文件
  5. find / -type f -name *.log -size +100M -exec rm -rf {} \; 查找并删除文件
  6. 上面的命令等效于find / -type f -name *.log -size +100M -delete
  7. find / -newer /etc/passwd 查找更改时间比passwd更新的文件
  8. find -maxdepth 2 -name passwd 类似于du可以设定查询目录深度
  9. find -perm 040 -type f 查找执行条件满足查询的文件
  10. find ~ -type f -exec ls -s {} \; |sort -n -r |head -5 查找最大的5个文件
  11. find / -type f -name *.zip -size +100M -exec rm -i {} \; 查找并删除百兆以上的压缩包

后台运行程序

  1. &
  2. nohup bash_file &> /dev/null &
  3. screen screen -S session_name -dm 一开始就断开的session并自定义名字 screen -ls查看session screen -r session_name恢复session,可通过session_id ctrl+a d暂时断开 ctrl+a w列出window ctrl+a A命名 ctrl+a k杀掉 ctrl+a c创建
  4. tmux
  5. at -f bash_file 10 am tomorrow atq查看队列 atrm at -d删除计划任务
  6. watch -n 5 command

wget下载功能

  1. wget -0 file_save_name http://my_host.com
  2. wget --limit-rate=200k http://my_host.com
  3. wget -c http://my_host.com 断点续传
  4. wget -b -o download_log_file http://my_host.com 后台下载
  5. wget --spider --user-agent='spider' 指定UA并检查文件并不下载
  6. wget --tries=7 http://my_host.com 重试次数
  7. wget --mirror -p --convert-links -P ./local_directory 复制整站并转换链接为relative
  8. wget -r -reject=gif -i -Q5m http://my_host.com 递归下载不下动图大于5M就quit

sed

sed 和 awk都应该着重介绍,sed内容比较庞大,已经作为一门“语言”

  1. sed 's/REGEXP/REPLACEMENT/FLAGS' file_name
  2. sed 's/women/us/2 file_name' 把第二个women换成us
  3. sed -n '/ruby/p' file_name 输出含有ruby的行
  4. sed '1,$d' file_name 删除第一行到最后一行
  5. sed -i ‘/匹配字符串/s/替换源字符串/替换目标字符串/g’ filename

awk

  1. awk '/search_pattern/ { action } /search_pattern/ { action }' file_name
  2. awk '{print;}' awk_file 原封输出
  3. awk '{print $2,$5}' awk_file 打印2 5字段
  4. awk '$1 > 200' awk_file 逻辑表达式
  5. awk '$4 ~ /[aA][a-z0-9]/' awk_file 正则匹配
  6. netstat -an -p tcp|awk '$1~/tcp4/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'统计tcp不同链接状态的数量
  7. awk -F|-f|-v 'BEGIN{} //{command1; command2;} END{}' file
  8. $0:整行 NF:字段数量 NR:每行的记录号 FNR:多文件不递增的行记录数 \t:制表符 FS:BEGIN定义的分隔符 ~:匹配 -F’[:#/]’:定义三个分隔符 ==:完全匹配 OFS:输出字段分隔符
1
2
3
BEGIN { Actions}
{ACTION} # 文件中的每一行默认的动作
END { Actions }

vim

  1. g``G``0``$ 光标移动 文首 文末 行首 行末
  2. % 半闭合的括号间移动
  3. vim +10 /etc/passwd 打开文件并定位到第十行

其他

  1. join 合并两个文件
  2. xargs 将输出内容当作参数传给下一命令 find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
  3. sort 非常实用的命令,给文件内容以及屏幕输出等任何东西排序 ls -alh |sort -nrk 5 按照文件大小倒序
  4. uniq 类似上面的sort命令 去重的
  5. stat 查看文件属性
  6. cut 切割数据,有点类似awk sed,用法cut -d : -f 1,4 file_name除了使用分隔符还可以按照字符分隔,cut -d , -c 8 file_name,另外-f参数可以使用2-表示2到末尾
  7. diff 比较两个文件的不同还可以使用vimdiff diff -u
  8. ac -d account_name 查看登录使用时间
  9. less file_name 查看大文件,vim式控制文件:f``b前后翻页 g``G文件首尾 v直接编辑 &parrtern正则查找 m制作标记 ctrl+g显示光标位置 F截取文件流 :e打开另一个文件 也可以查看多个文件
  10. chmod u+x,g-rw file_name 设置文件权限,-R递归处理,chmod --reference=file1 file2 给文件2设置和1一样的权限
  11. tail -f access.log -f error.log 查看两个增长的文件,调试web的时候比较有用
  12. date --date='tomorrow' +%s 明天的unix时间戳
  13. zip -P your_password zip_file.zip files_name_or_pattern 可以指定压缩比,设置密码
  14. unzip -t unzip -l 解压测试或查看内部文件
  15. tar -czvf tar_file.tar.gz your_files 压缩 -j换成bz2格式 tar -xzvf tar_file.tar.gz 解压

ssh

  1. 逃逸字符~ 连接后~^Z可以将当前ssh置于后台,jobs可以进行查看并通过fg切换回来
  2. /etc/ssh/ssd_config配置文件常见配置项目说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 禁止root用户登录
PermitRootLogin no

# 允许登录的用户/用户组
AllowUsers root rambone
AllowGroups root

# 禁止的用户/用户组
DenyUsers root rambone
DenyGrops root

# 登陆时限
LoginGraceTime 1m

# 不活动自动断开
ClientAliveInterval 600
ClientAliveCountMax 0 #从不检查

history相关

  1. ctrl+a ctrl+e ctrl+k删除至行尾 ctrl+u ctrl+w删除单个单词
  2. ctrl+r搜索历史命令 ctrl+l清屏 ctrl+s阻止屏幕输出 ctrl+q允许屏幕输出 ctrl+c ctrl+z挂起
  3. !$上一条命令最后参数 !to:p打印最近一次to的命令 !N上N条命令 !*上一条命令参数 !^上一条命令第一个参数
  4. export HISTCONTROL=ignoredups相邻命令去重 erasedups历史命令去重 export HISTIGNORE="pwd:ls:ls -ltr"忽略不记录某些命令
  5. ``

系统任务管理

rsync

iptables

系统性能监控

  1. free -th
  2. top 使用f 设置要查看的field以及排序依据 使用c显示进程路径
  3. df -Th 查看磁盘使用情况
  4. du -h --max-depth=1 查看目录文件及磁盘占用
  5. lsof /usr/bin/vim -u root 查看root用户使用vim打开的文件
  6. vmstat 1 10 每一秒显示一次,显示10次 系统内存,SWAP,磁盘IO CPU等使用情况
  7. netstat -ntap 显示所有TCP连接(包括监听,连接状态)及其进程与程序
  8. netstat --route 显示路由信息
  9. sysctl -a 显示所有内核参数
  10. nice -num_value process_name 调整进程优先级,-20最高,20最低
  11. kill pkill 杀进程
  12. ps axuf 显示正在运行的进程,进程树

ss命令

  1. ss是一个比netstat效率更高的查看socket的命令
  2. ss -lp查看监听状态的、有进程信息的
  3. ss -s汇总信息
  4. ss -t -u -utcp udp unix套接字
  5. ss src ADDRESS_PATTERN ss dst ADDRESS_PATTERN查看满足表达式的源地址或目标地址套接字

软件安装

  1. rpm -ivh xxx.rpm 安装
  2. rpm -qa --queryformat '%{name}-%{version}\n'以指定的格式查看所有已安装的包信息
  3. rpm -qip xxx.rpm 查看安装包的具体信息(name version url summary)等信息
  4. rpm -qlp xxx.rpm 罗列包内的文件
  5. rpm -qRp xxx.rpm 查看依赖
  6. apt-get install xxx 安装软件并处理好依赖问题
  7. apt-get purge xxx 彻底卸载,移除配置 apt-get remove xxx 移除二进制文件
  8. apt-cache search ^nginx$ 使用正则搜索软件包
  9. dpkg -l 列出安装的包

额外的技巧

  1. tee 用vim打开了一个没有写权限的文件,但是已经编辑了半天了,:w !sudo tee > /dev/null %可以拯救你于水火
  2. oh-my-zsh中的主题就是设置自定义的函数以及PS1 PROMPT等参数
  3. your_command 2>>/dev/null 将错误提示等输出隐藏,Permission denied信息就看不见了
  4. expect可以用来代替人去做一些交互任务,自动应答等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh
# 在同级目录下放置.host文件内容如下
# #跳转标识|服务器IP|登陆用户名|登陆密码
# test|172.30.11.218|work|homelink
# 使用该脚本可以实现通过标识直接登陆

OS_TYPE=`uname -s`
HOST_FILE=$(cd "$(dirname "$0")"; pwd)/.host
if [ $# == 0 ]
then
if [ $OS_TYPE = 'Linux' ] ; then
awk -F '|' '{system("echo -e \"\\e[0;33m["$3"@"$2"]\\e[m\t\t"$1"\"")}' $HOST_FILE
elif [ $OS_TYPE = 'Darwin' ] ; then
awk -F '|' '{system("echo \""$3"@"$2"\t\t"$1"\"")}' $HOST_FILE
else
echo "不支持的操作系统"
fi
fi
if [ $# == 1 ]
then
read _HOST _USER _PASSWD <<< `awk -F '|' '{if($1=="'$1'"){print $2,$3,$4}}' $HOST_FILE`
if [ ! -n "$_HOST" ]; then
echo "no host for "$1
exit 1
fi
echo $_HOST $_USER $_PASSWD
expect -c "spawn ssh $_USER@$_HOST
expect {
yes/no {send yes\r; exp_continue}
password: {send \"$_PASSWD\r\"};
}
interact"

fi

基础知识补充说明

  1. 文件Access time (文件被访问的时候更新) Modification time(文件内容修改的时候更新) Change time (inode data更新的时候更新)
  2. 当目录里面的文件被访问的时候目录被访问 –Access time