本文整理一些在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

规则:

  1. 变量与变量内容以等号“=”连接
  2. 等号两边不能有空格
  3. 变量内容如果有空格,可以使用双引号"包起来,双引号内的特殊字符可以保持变量特性
  4. 可以使用转义字符\来转义特殊字符,如“$,\,空格”等
  5. 若变量为扩展变量内容,需要以双引号和$变量名称来累加内容,如:”$PATH:/home”
  6. 取消变量:unset 变量名
  7. 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,你可以通过变量替换来实现。

有两种命令替换的方式:

其他

带过滤能力的文件夹拷贝

#!/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)当前执行的进程非常有用。

  1. ctrl + z 中断shell中正在执行的前台进程
  2. 执行 bg 使得进程在后台执行,会输出类似[1]+ my_command &的提示
  3. disown %1 使得shell关闭也不会向关闭后台进程了

参考:http://xmodulo.com/how-to-detach-linux-process-from-shell.html

关于前后台切换命令:

nohup

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"

标准输入输出

操作符:

  1. 标准输入(stdin):代码为0,符号:< 或者<<
  2. 标准输出(stdout):代码为1,符号:>或者>>
  3. 标准错误输出(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 向上翻页

Linux shell常用命令图

参考