Linux Bash 实用方法

本文总结作者在 Linux 下日常操作命令及实用方法。

统计目录(或文件)所占磁盘空间的大小 — du

1
du -sh $path

硬盘检测 — omreport

1
2
omreport storage pdisk controller=0 |grep ^Status
omreport storage vdisk controller=0

查看内核信息

1
2
$ uname -a
$ cat /proc/version

虚拟内核 — /proc

/proc 完全是内核虚拟的。内核将一些系统信息都放在/proc目录下一文件和文本的方式显示出来,如:/proc/cpuinfo、/proc/meminfo。

查看操作系统版本号

1
lsb_release -c

判断当前系统的PATH中是否有该命令的目录 — pathmunge

1
2
3
4
5
6
7
8
9
10
pathmunge{
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)";then
if["$2"="after"];then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
export PATH
}

判断当前系统的PATH中是否有该命令的目录,如果没有,则判断是要将该目录放于PATH之前还是之后。

定时任务 — crontab

crontab -l 查看定时任务
crontab -e 编辑定时任务
1
*/5 * * * * . /etc/profile;/bin/sh 可执行任务 >> 日志文件 2>&1

指定运行环境变量:

1
2
* * * * * . /etc/profile; /bin/bash scripts.sh
0 5 * * * . $HOME/.profile; /path/to/command/to/run

使用 date 时,需要转义:

1
2
3
4
/bin/echo $(/bin/date +'\%Y\%m\%d\%H\%M\%S')
DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

run-parts 来指定目录

1
01 * * * * root run-parts /etc/cron.hourly

: 修改完 crontab 文件后,不会立即执行,需要大约2-3 分钟后执行。

单词统计 — wc

常用参数:

-c或--bytes或--chars 只显示Bytes数
-l或--lines 只显示列数
-w或--words 只显示字数

文件分割 — split

用法:split [–help][–version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

-a, --suffix-length=N 指定输出文件名的后缀,默认为2个

-b, --bytes=SIZE 指定输出文件的字节数

-C, --line-bytes=SIZE 每一输出档中,单行的最大 byte 数

-d, --numeric-suffixes 使用数字代替字母做后缀

-l, --lines=NUMBER NUMBER 值为每一输出档的列数大小

zip 密码保护

1
2
3
4
5
6
7
8
9
$zip -P password var-log-protected.zip /var/log/*
$ zip -e var-log-protected.zip /var/log/*
Enter password:
Verify password:
$ unzip var-log-protected.zip
Archive: var-log-protected.zip
password:

文件和目录的复制-scp

scp 参数

-r 递归遍历文件夹
-l 限速
-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .
-C 使能压缩选项 .
-P 选择端口 . 注意 -p 已经被 rcp 使用 .
-4 强行使用 IPV4 地址 .
-6 强行使用 IPV6 地址 .

不同系统文件格式转化

dos2unix
unix2dos
unix2mac
mac2unix

文本查找 — grep

-n 显示行号
-V 反向展示
-A 1 前面一行
-B 1 前后各一行
-C 1 后面一行

去除linux文本中的^M

1
tr -d '\r'<source.txt >newfile.txt

文本转码

  • vim直接转换,如: :set filecoding=utf-8
  • enconv: 如:enconv -L zh_CN -x UTF-8 filename
  • iconv: 如:iconv -f GBK -t UTF-8 file1 -o file2

算术表达式

  • $((3+2))
  • $[3+2]
  • echo echo 2+3|bcg

/dev/random, /dev/urandom

真随机数,伪随机数

/dev/tcp & /dev/udp

bash程序中使用/dev/tcp/ip/port的方式就可以创建一个scoket作为客户端去连接服务端的ip:port

用零去填充一个指定大小的文件 — /dev/zero

1
2
3
4
$ dd if=/dev/zero of=./bigfile bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.3501 s, 3.1 GB/s

打开一个subshell执行命令

1. 使用&作为命令结束提交了作业控制任务时。

2. 使用|连接的命令会在subshell中打开。

3. 使用()封装的命令。

4. 使用coproc(bash 4.0版本之后支持)作为前缀执行的命令。

5. 要执行的文件不存在或者文件存在但不具备可执行权限的时候,这个执行过程会打开一个subshell执行。

xargs

1
2
3
find . -type d -name "*log*" | xargs -I {} sh -c "echo {};ls -la {} | tail -2
cat file | xargs -I % curl http://example.com/persons/%.tar

脚本调试

1
2
3
4
5
#!/bin/bash -v
-v 可视模式
-x 跟踪模式(xtrace)
-n 检查bash的语法错误
-e bash脚本命令执行错误的时候直接退出

重定向

find /etc -name passwd > /dev/null # 只输出错误信息到屏幕
find /etc -name passwd 2> /dev/null # 只输出正确信息到屏幕
find /etc -name passwd &> /dev/null # 所有信息都不输出到屏幕
find /etc -name passwd 2>&1 # 将标准错误输出的,重定向到标准输出再输出到屏幕
&>>、1>&2、?2>&3、6>&8、>>file 2>&1

eval

1
2
3
4
5
6
$ pipe="|"
$ cat /etc/passwd $pipe wc -l
cat: invalid option -- 'l'
Try 'cat --help' for more information.
$ eval cat /etc/passwd $pipe wc -l

环境变量

env     查看当前bash已经定义的环境变量
set     不加任何参数可以查看当前bash环境中的所有变量,包括环境变量和私有的一般变量
export     将一个一般变量编程环境变量

启动多线程

wait 是等待前面的后台进程都结束才运行

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat test.sh
#!/bin/bash
for i in $(seq 1000)
do
{
for j in 1 2 3
do
echo $j
sleep 1m
done
}&
done
wait

子进程崩溃程序

1
.(){ .|.& };.

移动除了个别文件外的文件到其他目录

1
mv ~/Linux/Old/!(Tux.png|Tux1.png|Tux2.png) ~/Linux/New/

sort 排序

sort的文件很大,需要指定一个临时文件来存储中间结果,sort -T tmpfile

程序前后台切换

& 最经常被用在一个命令的最后,可以把这个命令放到后台执行。
ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停
jobs 查看当前有多少在后台运行的命令
fg 将后台中的命令调至前台继续运行 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg 将一个在后台暂停的命令,变成继续执行 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

linux 防火墙 允许特定 IP 与当前机器的所有通信

root 权限下,

1
vim /etc/sysconfig/iptables

增加 以下命令:

1
-A INPUT -s 1.1.1.1 -j ACCEPT

重启防火墙:

1
service iptables restart

扩展:
只允许外网的 特定 ip (ip1,ip2) 访问

1
2
3
4
iptables -I INPUT -i lo -j ACCEPT
-A INPUT -s ip1 -j ACCEPT
-A INPUT -s ip2 -j ACCEPT
iptables -P INPUT DROP

update-alternatives

查看 java 链接可用的软件:

1
update-alternatives --display java

选择需要的软件:

1
update-alternatives --config java

update-alternatives 在一般情况下是由postinst 和 prerm 这样的安装脚本自动调用的,所以一个 alternative 的状态有两种:自动和手动。每个 alternative 的初始状态都是自动。如果系统发现管理员手动修改了一个 alternative,它的状态就从自动变成了手动,这样安装脚本就不会更新它了。如果你希望将一个 alternative 变回自动,只要执行代码:

1
2
3
update-alternatives --auto
update-alternatives --install gen link alt pri [--slave sgen slink salt] ...
update-alternatives --remove name path

date

当前时间: date +'%Y%m%d%H%M%S'
前一小时: date -d "-1 hour" +%Y%m%d%H
前一天: date -d "-24 hour" +%Y%m%d
时间格式转化: date -d'20160820' +%Y-%m-%d
指定输入格式转化: date -j -f "%d %b %Y" "27 JUN 2011" +%Y%m%d
时间戳转date: date -d '@1467338291' +%Y%m%d 
时区: -u, --utc, --universal  date --date='TZ="America/Los_Angeles" 09:00 next Fri'

Kill pid

1
ps aux|grep somename |grep -v grep |awk '{print $2}'|xargs kill -9

如果是脚本中,需要注意 $ 转义:

1
ps aux|grep somename |grep -v grep |awk '{print \$2}'|xargs kill -9

可以使用 pkill:

1
pkill -f "Process name"

killall:

1
killall -9 <processname>

前段时间看到一系列 SHELL 讲解,需要更深了解的可以移步,SHELL编程之执行环境,SHELL编程之执行过程,SHELL编程之特殊符号