本文整理一些在linux或mac的shell命令及脚本的使用。
文件操作
递归的创建目录
mkdir -p 目录名
如:mkdir -p test1/test2/test3
命令行下打开Finder并指向当前路径
open .
列出文件 ls
-a:全部文件
-d:仅列出目录本身
-l:列出长数据串,包含文件的属性
-t:按时间排序
-S:按文件大小排序
-r:将排序结果反向输出
-R:与子目录一起列出来
拷贝 cp
-a:相当于-pdr
-d:源文件如果是连接文件(link file),复制连接文件属性而非文件本身
-f:不询问用户,强制复制
-i:若目标文件已经存在,会提示
-l:建立硬连接(hard link)的连接文件,而非文件本身
-p:文件属性也一起复制
-r:递归复制,用于目录的复制
-s:复制成符号连接(symbolic link)文件,即快捷方式
-u:若目标文件比源文件旧,则更新目标文件
远程拷贝 scp
scp local_file remote_username@remote_ip:remote_folder
scp local_file remote_username@remote_ip:remote_file
scp -r local_folder remote_username@remote_ip:remote_folder
scp -r remote_username@remote_ip:remote_folder local_folder
scp -P port local_file remote_username@remote_ip:remote_folder
scp -P port remote_username@remote_ip:remote_folder local_file
文件查找
查看目录下所有递归的文件全路径列表
ls -AR | sed "s:^:`pwd`/:"
当前目录下递归查找文件,并全路径展示
find . -iname "*.filters" | sed "s:^:`pwd`/:" > filters.txt
当前目录下递归查找部分后缀的文件
find . -name *.h -o -name "*.hpp" -o -name "*.cpp" -o -name "*.cc" -o -name "*.c"
查找当面目录下的文件包含内容text
find . -type f | xargs grep "text"
进程操作
强杀进程
kill -SIGKILL pid
查找可执行文件位置
which cmd
查看进程命令行参数
ps -f -p <pid>
ps -ef | grep filter_name
获取进程pid
ps -ef | grep filter_name | grev -v grep | awk '{print $2}'
查看线程CPU内存等状况
top -H -p pid
mac下查看进程PID打开的文件路径
lsof -p 1066 -Fn
系统操作
查看端口占用
netstat -ntlp
mac查看占用该端口的进程
lsof -i:8080
查看本机ip
ifconfig | grep "inet"
查看命名是系统内置的还是外部的
type cmd
查看文件基本信息
file
显示环境变量
echo $PATH
,echo表示“显示”,$表示后面接的是变量
设置alias别名(~/.bashrc/
和~/.bash_profile
)
alias ll='ls -alh'
alias grep="grep --color=auto"
查看操作系统版本信息
uname -a
查看系统环境变量
env
查看当前进程可用的环境变量
set
mac刷新DNS
dscacheutil -flushcache
解析域名
dig address
ping address
host address
系统工具
SHA-1值校验
openssl sha1 full_path_to_file
mac下app的签名检查与安全策略相关查看
codesign -vv Tblive.app
codesign -dvv Tblive.app
spctl --assess -vvvv Tblive.app
mac下查看jar包的文件内容
jar包实质是zip格式压缩文件,可以使用unzip命令解压
unzip -x -q xxx.jar -d xxx
查看硬盘空间
df -h
du -h --max-depth=1
# 查看每个文件的占用
du -hs /var/log/*
计算行数
cat xxx.txt | wc -l
显示文件的某几行
显示最后1000行
tail -n 1000
从1000行开始显示
tail -n +1000
显示前面1000行
head -n 1000
显示1000行到3000行
cat filename| head -n 3000 | tail -n +1000
查看当前各个目录及文件的大小
du -sh *
监视文件的更新
tail -200f fileName
查看mac地址与ip(linux)
ifconfig | egrep "HWaddr|inet addr"
ssh连接服务器
ssh user@ip -p port
ssh配置与保持登陆 ~/.ssh/config
Host *
ServerAliveInterval 80
ServerAliveCountMax 6
ForwardAgent yes
CheckHostIP no
Compression yes
ControlMaster auto
ControlPath /tmp/ssh_connection_%h_%p_%r.sock
User zhenshan
Host dev
Hostname 10.218.131.124
User zhenshan
rpm常用命令
rpm -qf file-name 来查看某个文件到底是哪个rpm包里面的
rpm -qi package-name 来查看这个rpm包相关的信息,比如打包时间,svn地址等
rpm -ql package-name 来查看这个rpm包中到底有哪些文件
rpm -qV package-name 来验证这个rpm包安装后的文件有没有被修改过, 在怀疑rpm包的配置/脚本被人修改过的时候非常有用
字符串操作
grep/egrep 字符串过滤
// 查找当前目录下所有文件中包含字符串Linux的文件
egrep Linux *
// 过滤包含error或warn的行
cat file.txt | egrep -i "error|warn"
字符串拼接
foo="Hello"
foo="$foo World"
echo $foo
> Hello World
变量操作
关于变量的获取与设置
获取:
$variable
:获取变量值(用echo可以显示出来,未设置的变量,echo显示为空)
${variable}
:大括号来保护变量,比如 X=ABC; echo "${X}abc"
才能正常的打印出 ABCabc
设置:
myname=suninf
规则:
- 变量与变量内容以等号“=”连接
- 等号两边不能有空格
- 变量内容如果有空格,可以使用双引号
"
包起来,双引号内的特殊字符可以保持变量特性 - 可以使用转义字符
\
来转义特殊字符,如“$,\,空格”等 - 若变量为扩展变量内容,需要以双引号和$变量名称来累加内容,如:”$PATH:/home”
- 取消变量:unset 变量名
- export变量到环境变量,则该变量可以继续在子程序中使用
变量展开:单引号 VS 双引号
变量名会在双引号中展开,单引号中则不会。如果你不需要引用变量值,那么使用单引号可以很直观的输出你期望的结果。
示例1:
#!/bin/bash
# -n选项表示阻止echo换行
echo -n '$USER='
echo "$USER"
# 等价于上面的两行命令,在双引号中使用转义字符也是一种解决方案
echo "\$USER=$USER"
输出如下(假设你的用户名为suninf)):
$USER=suninf
$USER=suninf
示例2:
#!/bin/bash
LS="ls"
LS_FLAGS="-al"
$LS $LS_FLAGS $HOME
变量在执行展开,上面语句等同于 ls -al ~
创建shell脚本文件
一般创建.sh文件,文件开始指明是shell脚本,例子:
#!/bin/bash
for line in `cat data.txt`
do
echo $line
done
再添加可执行权限
chmod +x file.sh
命令替换
命令替换允许我们将一个命令的输出当做另一个命令的输入。比如你想要将命令的输出赋值给变量X,你可以通过变量替换来实现。
有两种命令替换的方式:
- 小括号扩展:
$(commands)
会展开为命令commands的输出结果。并且允许嵌套使用,所以commands中允许包含子小括号扩展。 反撇号 ` 扩展:将commands扩展为命令commands的输出结果。不允许嵌套。
#!/bin/bash files="$(ls)" # 使用双引号保护变量files中嵌套的换行 echo "$files"
其他
带过滤能力的文件夹拷贝
#!/bin/bash
# 设置根目录(假设在脚本文件所在目录的父目录)
ROOT_DIR=$(cd "$(dirname "$0")"; pwd)/..
# 定义通用拷贝函数
# 需要4个参数:待拷贝文件夹所在父路径,相对文件夹路径名,文件过滤模式,目标文件夹
function XCopy()
{
cd $1
find $2 -name $3 | while read line
do
# 依赖rsync保持相对路径
rsync -R $line $4
echo "copy: $4${line}"
done
}
# 拷贝部分指定目录下的文件
( XCopy "${ROOT_DIR}/Source/Include/" "base" "*.h" "${ROOT_DIR}/Pkg/include/" );
( XCopy "${ROOT_DIR}/Source/Include/" "testing/gtest/include/gtest" "*.h" "${ROOT_DIR}/Pkg/include/" );
后台执行程序
在terminal命令行下执行程序,当关闭shell或退出ssh时,进程会被退出,因为shell是父进程,关闭时会向所有子进程发送SIGINT通知。有时候从shell中,脱离(detach)当前执行的进程非常有用。
ctrl + z
中断shell中正在执行的前台进程- 执行
bg
使得进程在后台执行,会输出类似[1]+ my_command &
的提示 disown %1
使得shell关闭也不会向关闭后台进程了
参考:http://xmodulo.com/how-to-detach-linux-process-from-shell.html
关于前后台切换命令:
- jobs:查看当前有多少在后台运行的命令
- fg:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用
fg %jobnumber
将选中的命令调出 - bg:将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用
bg %jobnumber
将选中的命令调出
nohup
- 使用
nohup
命令(no hang up)也可以直接启动后台job,语法:nohup conmmand &
- 当前的shell terminal退出时,所执行的命令不会退出,例如:
nohup ./startup.sh &
setsid
setsid能让命令在后台运行,如果终端推出也能保持运行
setsid $ffmpeg_dir/ffmpeg -re -i $src_url -acodec copy -bsf:a aac_adtstoasc -vcodec copy -f flv $rtmp_url 2> "$0.log"
标准输入输出
操作符:
- 标准输入(stdin):代码为0,符号:
<
或者<<
- 标准输出(stdout):代码为1,符号:
>
或者>>
- 标准错误输出(stderr):代码为2,符号:
2>
或者2>>
对于输出:
- 单箭头
>
:当指定的文件不存在时,创建新文件写入数据;当文件存在时,清空原文件的内容写入数据。 - 双箭头
>>
:当指定的文件不存在时,创建新文件写入数据;当文件存在时,在原件内容的最后追加写入数据。
对于输入:
- 单箭头:将文件或其他输入作为标准输入。(
<
的左边必须是命令,<
右边的输入内容作为命令的输入) - 双箭头:结束输入
参考:http://blog.csdn.net/rainnnbow/article/details/47041615
命令行快捷键
常用的快捷键:
Ctrl + u
删除光标之前到行首的字符
Ctrl + k
删除光标之前到行尾的字符
Ctrl + c
取消当前行输入的命令,相当于Ctrl + Break
Ctrl + a
光标移动到行首(Ahead of line),相当于通常的Home键
Ctrl + e
光标移动到行尾(End of line)
Ctrl + l
清屏,相当于执行clear命令
Ctrl + r
显示:号提示,根据用户输入查找相关历史命令(reverse-i-search)
次常用快捷键:
Alt + f
光标向前(Forward)移动到下一个单词
Alt + b
光标往回(Backward)移动到前一个单词
Ctrl + w
删除从光标位置前到当前所处单词(Word)的开头
Alt + d
删除从光标位置到当前所处单词的末尾
Ctrl + y
粘贴最后一次被删除的单词
Ctrl + f
向下翻页
Ctrl + b
向上翻页