常用的Linux命令脚本


2017年01月05日

1. linux添加path脚本函数

prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }

将此函数写入 .bashrc中,使用:

prepend PATH /myapp/conf

2. 标准错误输出

o---stdin
1---stdout
2---stderr
> 等同于 1>
>> 等同于 1>>

将错误转换为标准输出,重定向到文件

cmd 2>&1 stdout.txt
cmd &> stdout.txt

错误重定向到 /dev/null

cmd 2> /dev/null

重定向文本到文件,并复制一份副本用作管道stdin(tee只能从stdin中读取)

cat "words" | tee stdout.txt | head -n

3. ssh 公钥,本地、远程端口转发

公钥链接服务器

ssh username@host -p port -i /path/of/privatekey

本地端口转发(transhost是转发的机器)

ssh -L localport:targethost:targetport transhost
ssh -L localport:targethost:targetport transusername@transhost -p thransport -i /path/of/thranshost/privatekey

开启本地端口后可以直接连本地端口进而通过转发连接到目标机器

ssh localhost -p localport

4. 在终端输入密码不直接显示密码文本(stty)

#!/bin/sh
echo "please enter password"
stty -echo # 禁止将输出发送到终端
read mypwd
stty echo
echo
echo "pwd is readed", $mypwd

5. fork炸弹(不断生成子进程,后台运行,很危险,可修改件/etc/security/limits.conf来限制可生成的最大进程数来避开)

:(){ :|:& };:

6. 管道以及子shell以及反引用

管道:    ls | cat -n > stdout.txt
子shell: cmd_output = $(commands) 如 cmd_output = $(ls | cat -n)
反引用:  cmd_output = `ls | cat -n`

7. 重复执行命令直至成功

方式一:

repeat() { while true; do $@ && return; done }

更高效的方式:

repeat() { while :; do $@ && return; done }

加入延时,防止服务器拉黑

repeat() { while :; do $@ && return; sleep 30; done }

使用方式:

repeat wget -c http://www.example.com/softer-1.0.0.tar.gz

8. 操作符(字符串比较最好使用双中括号)

-gt: 大于
-lt: 小于
-ge: 大于等于
-lt: 小于等于
-ne: 不等于
-eq: 等于
[ -f $file_var ]:如果给定的变量包含正常的文件路径或文件名,则返回真。
[ -x $var ]:如果给定的变量包含的文件可执行,则返回真。
[ -d $var ]:如果给定的变量包含的是目录,则返回真。
[ -e $var ]:如果给定的变量包含的文件存在,则返回真。
[ -c $var ]:如果给定的变量包含的是一个字符设备文件的路径,则返回真。
[ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真。
[ -w $var ]:如果给定的变量包含的文件可写,则返回真。
[ -r $var ]:如果给定的变量包含的文件可读,则返回真。
[ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真。

9. 常用命令

(find / grep / sort / cut / awk / sed / uniq / tee / tr / diff / cmp / split / xargs/ echo/ cat/ tail/ head/ chmod/ chown)

cd -  # 返回此前的目录
find . -name "*.txt"
find . ! -name "*.txt" # 否定匹配
find . -maxdepth 1 -name "*.txt" # 限制查找深度匹配
find . -maxdepth 1 -type d # 文件类型匹配, d: 目录,f:文件
# -atime 访问时间;-mtime 修改时间;-ctime 变化时间,单位:天,配合  + -:- 表示小于,+ 表示大于
# -amin;-mmin;-cmin  单位:分钟
find . -type f -atime -7 # 最近7天内被访问的文件
find . -type f -atime 7 # 在7天前被访问的文件
find . -type f -newer file.txt # 比file.txt文件修改时间更近的文件
find . -type f -size +2k # 大于2k的文件
find . -iname "abc*.txt" # 忽略大小写
find . \( -name "*.txt" -o -name "*.pdf" \) # 匹配任意一个,注意空格
find . -path "*/mypath/*.txt" # 匹配路径
find . -type f -name "*.swap" -delete #删除匹配文件
find . -type f -name "*.txt" -exec cat {} \;  # 对匹配文件执行命令操作,命名可以使shell脚本
find . "*.txt" -print0 | xargs -0 rm -f #找出匹配的文件并删除
find . -name "*.txt" -print0 | xargs -0 wc -l # 统计匹配的每个文件的行数以及总行数
echo "asdKJAIKAJAjkasdf" | tr 'a-z' 'A-Z' # 大小写转换
echo "a kjad9 akj23k 23j21jksd9u" | tr -d '{0-9}' # 删除指定集合的字符
echo "a kjad9 akj23k 23j21jksd9u" | tr -d -c '{0-9}' # 删除指定集合的补集的字符
echo "aaa   sd   eew   sdf    as" | tr -s ' ' # 压缩指定集合中的重复字符
cat geeks.txt | tr ':[space]:' '\t' > out.txt  # 将空格替换为Tab
cat myfile | sort | uniq -c | sort -r | more # 统计每行出现的次数,倒序输出
cat myfile | sort | uniq -d # 输出重复行
tail -n +100 data.txt | more # 从100行开始查看data.txt文件
filename = `mktemp`  # 创建临时文件
dd if=/dev/zero of=out.txt bs=1M count=2  # 创建特定大小的文件,这里创建 2M的文件并以零填充
filedir = `mktemp -d` # 创建临时目录
split -b 20k data.txt -d data_prefix # 将data.txt分隔为每个20k大小的文件,并以 数字后缀命名
split -l 50000 data.txt data_prefix # 分隔文件,每个文件 50000 行
filename="mypng.jepg"; echo ${filename%.*} # 提取文件名称: mypng
filename="mypng.jepg"; echo ${filename#*.} # 提取文件后缀:jepg
head -n 80 /dev/urandom | tr -dc 0-9 | head -c 20 # 纯数字20位长度的随机数
head -n 80 /dev/urandom | tr -dc 0-9a-zA-Z | head -c 20 # 字母大小写+数字的20位长度的随机数
LC_CTYPE=C tr -dc A-Za-z0-9 < /dev/urandom | head -c 20 # mac版本下的方式
sudo chown $(whoami) /usr/local/bin  # 更改 /usr/local/bin的所属用户
wc -l *.txt  # 统计txt文件的行数以及总行数
curl ip.cn  # 查看公网ip
curl ipinfo.io  # 查看公网ip
iostat -d -k 1 10  # 查看 磁盘设备,1s刷新一次,一共显示10次,单位是 k
iostat -x 2  # 查看IO扩展,2s刷新间隔
vmstat 2  # 2s刷新间隔,查看内存信息,-a 参数表示活动与非活动,-d 磁盘
cat /proc/meminfo # 内存信息
cat /proc/cpuinfo | grep "core id" | uniq | wc -l  # CPU 核数
df -h  # 显示磁盘分区大小
du -sh *.txt  # 显示所有txt文件大小
lsof | grep deleted # 查询未执行完成的删除命名(有时候就是因为这些命名导致机器内存CPU飙高)
sed -n '/2016-01-18 00:00:00/,/2016-01-21 18:00:00/p'  /stdout.log-042414.log  # 查看指定时间的日志内容

ps -eo rss,pmem,pcpu,vsize,args |  sort -k 1 -r -n | less  # 按内存消耗降序查看进程
ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu       # 按CPU消耗 升序查看进程
ps aux|grep java | grep -v grep | awk '{print $2}' | xargs kill -9  # 强杀有关java的进程

getconf LONG_BIT  # 查看机器多少位
file /sbin/init   # 查看机器多少位

ping www.baidu.com -c 5 -i 2  # -i 指定发送消息包时间间隔,-c 指定发送包的个数

# 清空文件
> myfile.txt  # 重定向null对象到文件
: > myfile.txt  # : 和true类似
true > myfile.txt
cat /dev/null > myfile.txt
cp /dev/null myfile.txt
dd if=/dev/null of=myfile.txt
echo "" > myfile.txt
echo -n "" > myfile.txt  # 使用 -n 参数 则不会有换行符
echo > myfile.txt
truncate -s 0 myfile.txt

# jvm info

   
jmap -histo:live pid | more  # 堆对象情况
jmap -dump:format=b,file=heap.dump pid # 导出堆文件
jmap –heap pid # 堆概要信息
jmap -finalizerinfo pid # 正在回收的对象信息
jmap -permstat pidK
jstat –class <pid> # 显示加载class的数量,及所占空间等信息
jstat -compiler <pid> # 显示VM实时编译的数量等信息
jstat -gc <pid> # 可以显示gc的信息,查看gc的次数,及时间
jstat -gccapacity <pid> # 可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
jstat -gcutil <pid> # 统计gc信息
jstat -gcnew <pid> # 年轻代对象的信息
jstat -gcnewcapacity<pid> # 年轻代对象的信息及其占用量
jstat -gcold <pid> # old代对象的信息
jstat -gcoldcapacity <pid> # old代对象的信息及其占用量
jstat -gcpermcapacity<pid> #  perm对象的信息及其占用量
jstat -printcompilation <pid> # 当前VM执行的信息
jhat
jstack
jinfo
jps

10. 瑞士军刀 nc 命令

server1: 192.168.10.148

server2: 192.168.10.149

服务器间聊天发送消息

nc -l 12368  # 在 server1 上监听 12368 端口
nc 192.168.10.148 12368 # 在server2 上执行, ip为server1的Ip

传文件( server1 to server2)

nc -l 12368 > recieve.txt  # 在server2 上开启端口监听, 将消息保存为 recieve.txt文件
nc 192.168.10.149 12368 < send.txt  # 在server1 连接, 输入流为 send.txt文件

11. 处理CSV文件命令 xsv

xsv count word.csv  # 统计行,可以喝wc -l 比较下大文本数据所用的内存以及时间
xsv xsv frequency word.csv --limit 5  # 频率统计

更多移步: https://github.com/BurntSushi/xsv/

还有https://github.com/wireservice/csvkit