Linux Shell脚本攻略笔记[速查]
- Linux Shell脚本攻略笔记[速查]
- 资源
- shell script
- run shell script
- echo
- printf
- 环境变量和变量
- pgrep
- shell数学运算
- 命令状态
- 文件描述符和重定向
- cat
- 数组和关联数组
- alias
- date
- 调试脚本
- 函数和参数
- 管道
- 读取命令输出
- read
- 字段分隔符和迭代器
- 循环
- 比较和测试
- find
- xargs
- tr
- md5sum
- sha1sum
- 对目录进行校验
- sort
- uniq
- tempfile
- split
- bash变量匹配切分
- expect
- dd
- comm
- mkdir
- ls
- chmod
- chown
- chattr
- touch
- ln
- readlink
- file
- 读文件
- diff
- head
- tail
- pushd/popd
- cd
- wc
- tree
- grep
- cut
- join
- sed
- awk
- 文件迭代
- paste
- tac
- rev
- wget
- curl
- lynx
- tar
- cpio
- gzip
- zcat
- bzip
- lzma
- zip
- base64
- md5sum
- rsync
- git
- dd
- mount
- 网络相关
- 磁盘和系统
- 进程和线程
Linux Shell脚本攻略的笔记,markdown编写,可以速查(ctrl+f)
2013-09-08 从历史网摘中补充 2014-02-16 增加<<shell脚本指南>>笔记补充
资源
shell script
#!/bin/bash # do something
run shell script
sh script.sh or chmod a+x script.sh ./script.sh # 会读取首行的解释器, 执行
cmd
cmd1; cmd2 or cmd1 cmd2
echo
echo 的功能正如其名,就是基于标准输出打印一段文本
echo "welcome to bash" echo welcome to bash
使用不带引号的echo时,无法显示分号
使用单引号echo时,bash不会对单引号中变量求值 '$var'
echo 中转义换行符
默认情况,echo将换行标志追加到文本尾部,可以忽略结尾换行符
echo -n 'test\n'
对字符串进行转义
echo -e '1\t2\t3'
打印彩色输出
文字颜色码 重置0 黑色30 红色31 绿色32 黄色33 蓝色34 洋红35 青色36 白色37 echo -e "\e[1;31m This is red test \e[0m" 背景颜色码 重置0 黑色40 红色41 绿色42 黄色43 蓝色44 洋红45 青色46 白色47 echo -e "\e[1;42m Green Background \e[0m"
printf
可以格式化字符串, 使用参数同c中printf一样
printf "hello world"
默认不会加换行符, 需要手动添加
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564 3 Jeff 77.56
环境变量和变量
bash中,每个变量的值都是字符串,无论你给变量赋值时是否使用引号,值都会以字符串的形式存储
环境变量
查看所有与此终端进程相关的环境变量
env
查看某个进程的环境变量
cat /proc/$PID/environ
变量赋值
var=value var='the value' var="the $PARAM" echo $var echo ${var} var = value非变量赋值是相等操作
环境变量
未在当前进程中定义,而是从父进程中继承而来的变量 export 设置环境变量,之后,从当前shell 执行的任何程序都会继承这个变量 export PYTHONPATH=$PYTHONPATH:/home/ken/workspace
常用的环境变量
PATH 查找可执行文件路径, 通常定义在/etc/environment or /ect/profile or ~/.bashrc 修改: export PATH=$PATH:/new/path/ HOME PWD USER UID SHELL
获取字符串长度
length=${#var}
识别当前shell版本
echo $SHELL /bin/bash echo $0 bash
检查是否为超级用户 or 普通用户
root的UID=0 if [ $UID -ne 0 ] then echo "not root user" else echo "root" fi
修改bash的提示字符
设置PS1变量 \u用户名 \h主机名 \w当前工作目录
pgrep
获取某个进程名对应进程id
pgrep gedit
shell数学运算
整数运算
let
no1=4 no2=5 let result=no1+no2 let no1++ let no2-- let no1+=7 let no2-=7
expr(少用)
result=`expr 3 + 4` result=$(expr $no1 + 5)
其他方法
result=$[ no1 + no2 ] result=$[ $no + 5 ] result=$(( no1 + 5 ))
浮点数
echo "4 * 0.56" | bc 设定精度 echo "scale=2;3/8" | bc 进制转换 echo "obase=2;100" | bc 平方 echo "10^10" | bc 平方根 echo "sqrt(100)" | bc
命令状态
当命令成功完成, 返回0
发生错误并退回, 返回非0
可以从$?中获取 cmd; echo $?
文件描述符和重定向
文件描述符: 与文件输入/输出相关联的整数, 用来跟踪已打开的文件
0 stdin 标砖输入 1 stdout 标准输出 2 stderr 标准错误
重定向到文件
清空文件写入新内容 echo "test" > temp.txt 追加 echo "test" >> temp.txt >等价于1> >>等价于 1>>
输出分离或合并
分离 cmd 2>stderr.txt 1>stdout.txt 合并 cmd > output.txt 2>&1 or cmd &> output.txt
扔到垃圾桶
/dev/null 特殊设备文件, 接收到的任何数据都会被丢弃(位桶/黑洞) 只有标准错误 cmd 2 > /dev/null 标准输出和标准错误 cmd >/dev/null 2>&1
同时输出到终端和文件
cmd | tee file1 tee默认覆盖,可以-a选项追加 cmd | tee -a file1
将stdin作为命令参数
cmd1 | cmd2 | cmd3 -
将文件重定向到命令
cmd < file
自定义文件描述符
使用文件描述符3打开并读取文件 exec 3<input.txt cat <&3 使用文件描述符4进行写入 exec 4>output.txt echo newline >&4
cat
cat, concatenate(拼接)
“cat”代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容
一般格式
cat file1 file2 file3 从管道中读取 OUTPUT_FROM_SOME_CMDS | cat echo "test" | cat - file1
压缩空白行, 多个连续空行变成单个
cat -s file
配合tr移除空白行
cat file | tr -s '\n' #连续多个\n -> \n
加行号
cat -n file
显示制表符等
cat -T file cat f > t 注意:“>>”和“>”调用了追加符号。它们用来追加到文件里,而不是显示在标准输出上。 “>”符号会删除已存在的文件,然后创建一个新的文件。 所以因为安全的原因,建议使用“>>”,它会写入到文件中,而不是覆盖或者删除。
输入多行文字(CTRL + d 退出)
cat > test.txt
数组和关联数组
普通数组,整数作为数组索引, 借助索引将多个独立的数据存储为一个集合(list)
关联数组,可以使用字符串作为索引(map)
数组
定义
array_var=(1 2 3 4 5) or array_var[0]="test1" array_var[3]="test3"
读取
echo ${array_var[0]}
以清单形式打印
echo ${array_var[*]} echo ${array_var[@]}
长度
echo ${#array_var[*]}
获取索引列表
echo ${!array_var[*]}
关联数组
declare -A ass_array 内嵌索引-值 ass_array=([index1]=value1 [index2]=value2) 独立 ass_array[index3]=value3 echo ${ass_array[index1]}
alias
alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。
alias new_command='command seq' unalias new_command 使用原生命令 \new_command
date
“date”命令使用标准的输出打印当前的日期和时间,也可以深入设置
读取日期
date
时间戳
date +%s
日期转换为时间戳
date --date "Thu Nov 18 08:07:21 IST 2010" +%s
日期格式化
星期 %a Sat %A Saturday 月 %b Nov %B November 日 %d 31 固定日期格式mm/dd/yy %D 年 %y 10 %Y 2010 小时 %I/%H 08 分钟 %M 33 秒 %S 10 纳秒 %N 696308515 Unix纪元时 %s
格式化
date "+%Y %B %d" date +%Y-%m-%d 输出: 2011-07-28 date +"%Y-%m-%d %H:%M:%S"
设置日期和时间
date -s "格式化日期字符串" date -s "21 June 2009 11:01:22"
延时
sleep number_of_seconds
两天后及两天前
date -d '2 days' +%Y%m%d date -d '2 days ago' +%Y%m%d
某一天的几天前
TODAY=`date +%Y%m%d` DAY_1_AGO=`date -d "$TODAY 1 days ago" +%Y%m%d`
时间戳日期转换
date -d @1193144433 date -d @1193144433 "+%Y-%m-%d %T" 反向: date -d "2007-10-23 15:00:23" "+%s"
赋值给变量
DATE=$(date +%Y%m%d) DATE=`date +%Y%m%d`
调试脚本
打印出所执行的每一行命令
bash -x script.sh sh -x script.sh
在脚本中设置开关
set -x 在执行时显示参数和命令 set +x 关闭调试 set -v 当命令进行读取时显示输入 set +v 禁止打印输入
直接修改脚本
#!/bin/bash -xv
函数和参数
定义函数
function fname() { statements; } or fname() { statements; }
调用
fname; 传参 fname arg1 arg2;
接收参数
$1第一个参数 $2第二个参数 $n第n个参数 "$@"被扩展成 "$1" "$2" "$3" "$*"扩展成"$1c$2c$3", 其中c是IFS第一个字符 "$@"使用最多, $*将所有的参数当做单个字符串
bash支持递归
导出函数,可以作用到子进程中
export -f fname
函数及命令返回值
cmd; echo $? 退出状态,成功退出,状态为0,否则,非0 cmd if [ $? -eq 0 ] then echo "success" else echo "fail" fi
管道
前一个命令的输出作为后一个命令的输入
$cmd1 | cmd2 | cmd3
读取命令输出
子shell subshell cmd_output=$(COMMANDS) or 反引用 cmd_output=`COMMANDS`
子shell本身是独立进程, 不会对当前shell有任何影响
pwd; (cd /bin; ls) pwd #同上一个pwd
保留空格和换行符
out=$(cat text.txt) echo $out #丢失所有换行符 out="$(cat text.txt)" echo $out #保留 cat a 1 2 3 echo $(cat a) 1 2 3 echo "$(cat a)" 1 2 3
read
read, 用于从键盘或标准输入中读取文本
读取n个字符存入变量
read -n number_of_chars variable_name
不回显的方式读取密码
read -s var
显示提示信息
read -p "Enter input:" var
限时输入
read -t timeout var
设置界定符
read -d delim_char var read -d ":" var hello:
字段分隔符和迭代器
内部字段分隔符,Internal Field Separator, IFS
IFS默认为空白字符(换行符,制表符,空格)
data="name,sex,rollno" oldIFS=$IFS IFS=, for item in $data do echo $item done IFS=$oldIFS
循环
for循环
echo {1..50} for i in {a..z}; do actions; done; or for((i=0;i<10;i++)) { commands; }
while循环
while condition do commands; done
until循环
until condition do commands; done
比较和测试
if条件
if condition; then commands; elif condition; then commands; else commands; fi
逻辑运算符进行简化, 短路运算更简洁
[ condition ] && action; [ condition ] || action;
算术比较
-gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 -ne 不等于 -eq 等于 注意[]和操作数之间的空格 [ $var -eq 0 ] and [ $var -ne 0 -a $var2 -ge 2 ] or [ $var -ne 0 -o $var2 -ge 2 ]
文件测试
[ -f $file_var ] 正常文件路径或文件名 [ -x $var ] 可执行 -d 目录 -e 存在 -c 字符设备文件 -b 块设备文件 -w 可写 -r 可读 -L 符号链接
字符串比较
[[ $str1 = $str2 ]] [[ $str1 == $str2 ]] [[ $str1 != $str2 ]] 不等 [[ $str1 > $str2 ]] [[ $str1 < $str2 ]] [[ -z $str1 ]] 空 [[ -n $str1 ]] 非空 if [[ -n $str1 ]] && [[ -z $str2 ]] then commands; fi
find
搜索指定目录下的文件,从开始于父目录,然后搜索子目录
基本
find base_path # 打印文件和目录列表 find . -print #默认\n分割文件名
文件名
find path -name "*.txt" -print -iname 忽略大小写 多个条件 or find . \( -name "*.txt" -o -name "*.py" \)
文件路径
通配符 find /home/users -path "*slynux*" -print 正则 find . -regex ".*\(\.py\|\.sh\)$" -iregex 忽略大小写
否定参数
find . ! -name "*.txt" -print
根据文件类型
find . -type d -print f 普通文件 l 符号链接 d 目录 c 字符设备 b 块设备 s 套接字 p Fifo
设定目录深度
find . -maxdepth 1 -type f -print find . -mindepth 2 -type f -print
根据文件时间搜索
计量单位 天 -atime 最近一次访问时间 -mtime 最后一次被修改时间 -ctime 文件元数据,最近一次修改时间 find . -type f -atime -7 -print #最近七天内被访问的 find . -type f -atime 7 -print #恰好在七天前 +7 -print #超过七天 计量单位 分钟 -amin 访问时间 -mmin 修改时间 -cmin 变化时间 find . -type f -amin +7 -print #访问时间超过7分钟的 find . -type f -newer file.txt -print #用于比较时间戳的参考文件,比参考文件更新的文件
基于文件大小的搜索
find . -type f -size +2k + 大于 -小于 无符号,恰好等于 b 块 c 字节 w 字(2字节) k 千字节 M 兆字节 G 吉字节
删除匹配的文件
find . -type f -name "*.swp" -delete #注意:-delete位置一定是最后
文件权限及所有权
find . -type f -perm 644 -print find . -type f -user slynux -print
执行命令或动作(最强大的命令)
find . -type f -user root -exec chown slynux {} \; find . -type f -exec cp {} OLD \; find . -iname "abc.txt" -exec md5sum {} \; {} 江北替换成对应文件名 exec无法结合多个命令,可以将多个命令放入脚本,调用之
跳过指定目录
find . \( -name ".git" -prune \) -name '*.txt'
xargs
将标准输入数据转化成命令行参数
将stdin接收到的数据重新格式化,再将其作为参数传给其他命令
多行输入转化成单行输出
cat example.txt | xargs #空格替换掉\n
切成多行,每行n个参数
cat examplet.txt | xargs -n 3
可以指定分隔符
echo "aaaXbbbXccc" | xargs -d 'X'
将参数传递给脚本(类似循环)
cat args.txt | xargs -n 1 ./cecho.sh ./cecho.sh -p arg1 1 需要变更 cat args.txt | xargs -I {} ./cecho.sh -p {} 1
find与xargs组合
find . -type f -name "*.txt" -print | xargs rm -rf
其他
cat file | ( while read arg; do cat $arg; done ) cat file | xargs -I {} cat {}
tr
tr可以对来自标准输入的字符进行替换,删除以及压缩(translate, 可以将一组字符变成另一组字符)
tr只能通过stdin,无法通过其他命令行进行接收参数
格式
tr [options] source-char-set replace-char-set
选项
-c 取source-char-set补集,通常与-d/-s配合 -d 删除字source-char-set中的所列的字符 -s 浓缩重复字符,连续多个变成一个
字符替换
cat /proc/12501/environ | tr '\0' '\n'
大小写替换
echo "HELLO" | tr 'A-Z' 'a-z' cat text | tr '\t' ' '
删除字符
echo "hello 123 world 456"| tr -d '0-9' hello world
字符集补集
echo "hello 1 char 2" | tr -d -c '0-9' #删除非0-9 12
压缩字符
连续的重复字符
echo "GNU is not UNix" | tr -s ' '
字符类
alnum 字母和数字 alpha 字母 cntrl 控制字符 digit 数字 graph 图形字符 lower 小写字母 print 可打印字符 punct 标点符号 space 空白字符 upper 大写字母 xdigit 十六进制字符 tr '[:lower:]' '[:upper:]'
md5sum
32个字符的十六进制串
md5sum filename md5sum filename1 filename2
sha1sum
40个字符十六进制串
sha1sum file
对目录进行校验
需安装md5deep软件包
md5deep/sha1deep md5deep -rl dirname r递归,l相对路径
sort
语法
sort [options] [file(s)] -c 检查是否已排序 -u 丢弃所有具有相同键值的记录 -b 忽略开头空白 -d 字典序 -g 一般数值,以浮点数类型比较字段,仅支持gnu -i 忽略无法打印的字符 -k 定义排序键值字段 -n 以整数类型比较字段 -r 倒转 -o 输出到指定文件
排序
sort file1 > file1.sorted sort -o file1.sored file1
按数字, 要明确
sort -n file1
逆序
sort -r file
测试一个文件是否已经被排过序
sort -C file if [ $? -eq 0 ]; then echo ssss fi
合并两个排过序的文件,并不需要对合并后的文件进行再排序
sort -m sorted1 sorted2
根据键或者列排序(按照哪一个列)
sort -k 1 data
限定特定范围内一组字符
key=char4-char8 sort -k 2,3 data sort -k2.4,5.6 file 第二个字段的第四个字符开始比较,直到第五个字段的第六个字符
忽略前导空白及字典序排序
sort -bd unsorted.txt
去重
sort a.txt | uniq sort -u a.txt
uniq
用法
uniq file
只显示未重复的记录
uniq -u file
找出重复的行
uniq -d file -s 可指定跳过前N个字符 -w 指定用于比较的最大字符数
统计各行出现的次数
uniq -c file
p57
tempfile
只有在基于Debian的发布版才有(Ubuntu/Debian)
temp_file=$(tempfile) 等同 temp_file="/tmp/file-$RANDOM" #$$为进程id temp_file="/tmp/var.$$"
split
按大小分割文件, 单位k(KB), M, G, c(byte), w(word)
split -b 10k data.file
-d数字后缀,-a后缀长度
split -b 10k data.file -d -a 4
分割后指定文件名前缀
split -b 10k data.file file_prefix 设置后缀格式 split -b 10k data.file -d -a 4 file_prefix
根据行数分割
spilt -l 10 data
其扩展是csplit,可根据文件特性切分,关注
bash变量匹配切分
sample.jpg
file_jpg="sample.jpg" 从右向左匹配 ${file_jpg%.*} #sample 从左向右匹配 ${file_jpg#.*} #jpg % # 属于非贪婪 %% ## 属于贪婪
贪婪非贪婪
var=hack.fun.book.txt ${var%.*} #hack.fun.book ${var%%.*} #hack ${var#.*} #fun.book.txt ${var##.*} #txt
expect
实现自动化
spawn ./ineractive.sh expect "Enter the number" send "1\n" expect "Enter name:" send "hello\n" expect eof spawn指定需要自动化的命令 expect提供需要等待的消息 send发送消息 expect eof指明命令交互结束
dd
生成任意大小的文件
# 创建一个1M大小的文件junk.data bs=2M count=2 则文件大小4M dd if=/dev/zero of=junk.data bs=1M count=1 输入文件 输出文件 块大小 复制块数 块大小单位 字节(1B) c 字(2B) w 块(512B) b 千字节(1024B) k 兆字节(1024KB) M 吉字节(1024MB) G
comm
两个文件之间比较,输出三列
onleA \t onlyB \t bothAB comm A B -1 -2 #删除第一第二列 -3 删除第三列 可以得到A^B A-B B-A
mkdir
“mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了”(“cannot create folder, folder already exists”)
mkdir dirpath mkdir -p dirpath1/dirpath2 #一次多个目录 mkdir -p /home/user/{test,test1,test2}
注意:目录只能在用户拥有写权限的目录下才能创建
ls
ls命令是列出目录内容(List Directory Contents)的意思。运行它就是列出文件夹里的内容,可能是文件也可能是文件夹
ls文件的内容关系
- 普通文件 d 目录 c 字符设备 b 块设备 l 符号链接 s 套接字 p 管道 文件权限序列 rwx rwS setuid(S),特殊权限, 出现在x的位置, 允许用户以其拥有者的权限来执行文件, 即使这个可执行文件是由其他用户运行的 目录 r,允许读取目录中文件和子目录列表 w,允许在目录中创建或删除文件或目录 x,指明是否可以访问目录中的文件和子目录 rwt/rwT 粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限,典型例子/tmp, 写保护
查看目录
ls -d */ ls -F | grep "/$" ls -l | grep "^d" find . -type d -maxdepth 1 -print
其他
ls -l 命令已详情模式(long listing fashion)列出文件夹的内容 ls -a 命令会列出文件夹里的所有内容,包括以”.”开头的隐藏文件
chmod
设置文件权限
“chmod”命令就是改变文件的模式位。chmod会根据要求的模式来改变每个所给的文件,文件夹,脚本等等的文件模式(权限)。
设置权限
user group others all u g o a chmod u=rwx g=rw o=r filename chmod u+x filename chomd a+x filename #所有 chmod a-x filename chmod 764 filename #设置粘滞位 chmod a+t dirname #递归改变 chmod 777 . -R
注意:对于系统管理员和用户来说,这个命令是最有用的命令之一了。在多用户环境或者服务器上,对于某个用户,如果设置了文件不可访问,那么这个命令就可以解决,如果设置了错误的权限,那么也就提供了为授权的访问。
chown
每个文件都属于一个用户组和一个用户“chown”命令用来改变文件的所有权,所以仅仅用来管理和提供文件的用户和用户组授权。
改变所有权
chown user.group filename
递归
chown -R user.group .
每次都以其他用户身份执行(允许其他用户以文件所有者的身份来执行)
chomod +s executable_file chown root.root executable_file chmod +s executable_file ./executable_file
chattr
创建不可修改文件
chattr +i file
一旦被设置为不可修改, 任何用户包括超级用户都不能删除该文件, 除非其不可修改的属性被移除
chattr -i file
touch
“touch”命令代表了将文件的访问和修改时间更新为当前时间。
touch命令只会在文件不存在的时候才会创建它(空白文件)。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。
空白文件
touch filename for name {1..100}.txt do touch $name done
修改文件访问时间
touch -a "Fri Jun 25 20:50:14 IST 1999" filename touch -m #修改文件内容的修改时间
修改文件或目录的时间戳(YYMMDDhhmm)
touch -t 0712250000 file
注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。
ln
建立软连接
ln -s target symbolic_link_name
如果目的路径已经存在,而没有指定 -f 标志,ln 命令不会创建新的链接,而是向标准错误写一条诊断消息并继续链接剩下的 SourceFiles。
-f 促使 ln 命令替换掉任何已经存在的目的路径
readlink
读取链接对应真是路径
readlink web readlink ~/.vim /Users/ken/github/k-vim
file
通过查看文件内容来找出特定类型的文件
打印文件类型信息
file filename
打印不包含文件名在内
file -b filename
e.g.
file /etc/passwd /etc/passwd: ASCII English text file -b /etc/passwd ASCII English text
读文件
while read line; do something done < filename
diff
生成文件差异
非一体化
diff version1.txt version2.txt
一体化, 可读性更好
diff -u version.txt
使用patch将命令应用于任意一个文件
diff -u version1.txt version2.txt > version.patch
patch -p1 version1.txt < version.patch
递归作用于目录
diff -Naur directory1 directory2 -N 所有缺失的文件作为空文件 -a 所有文件视为文本文件 -u 一体化输出 -r 递归遍历
head
前10行打印
head file
前n行
head -n 4 file
扣除最后N行之外的所有行
head -n -5 file
tail
最后10行
tail file
打印最后五行
tail -n 5 file tail -5 file
扣除前n行
tail -n +(N+1)
实时动态打印
tail -f growing_file
当某个给定进程结束后, tail随之终结
tail -f file --PID $PID
pushd/popd
将当前路径压入栈
pushd
压入某个路径
pushd /home/ken
查看当前路径列表
dirs
切换到某一个
#dirs从左到右编号 0 - pushd +3
移除最近压入栈的路径并切换到下一个目录
popd
cd
经常使用的“cd”命令代表了改变目录。它在终端中改变工作目录来执行,复制,移动,读,写等等操作
切换到上一目录
cd -
会到HOME目录
cd cd ~
会到上一级目录
cd ..
wc
Word Count
统计行数
wc -l file
统计单词数
wc -w file
统计字符数
wc -c file
统计所有
wc file
统计最长行的长度
wc file -L
tree
以图形化的树状结构打印文件和目录的结构,需要自行安装
tree ~/unixfile
重点标记出匹配某种样式的文件
tree PATH -P "*.sh"
只标记符合样式之外的文件
tree path -I PATTERN
同时打印文件和目录大小
tree -h
grep
文本搜索工具, 支持正则表达式和通配符
‘grep‘命令搜索指定文件中包含给定字符串或者单词的行
基本用法
grep "match_pattern" file1 file2
使用颜色重点标记
grep word filename --color=auto
扩展型使用正则
grep -E "[a-z]+" egrep "[a-z]+"
只输出匹配到的文本部分
grep -o word filename
除匹配行外的所有行
grep -v word filename
统计匹配行数
grep -c 'text' filename
打印出包含匹配字符串的行数
grep linux -n filename
打印样式匹配所位于的字符或字节的偏移
echo "gnu is not unix" | grep -b -o "not"
搜索多个文件,找出匹配文本位于哪个文件中
grep -l linux file1 file2 取反 grep -L
递归搜索目录
grep -R "text" dir
忽略大小写
grep -i "hello" filename
匹配多个样式
grep -e "pattern1" -e "pattern2" file
运行匹配脚本
grep -f pattern_file source_file pattern_file: hello cool
在搜索中包含、排除文件
grep --include *.{c,cpp} word file
排除
grep --exclude "Readme" filename --exclude-dir
静默输出,用于判断(不会产生任何输出)
grep -q word file if [ $? -eq 0 ]
打印匹配行之前,之后的行
grep -A 3 之后3行 grep -B 3 之前 grep -C 3 前后
使用行缓冲
在使用tail -f命令时是可以及时看到文件的变化的,但是如果再加上一个grep命令,可能看到的就不那么及时了, 因为grep命令在buffer写不满时就不输出,可以通过选项 --line-buffered 来搞定,如: tail -f file.txt | grep something --line-buffered
cut
语法
cut -c list [ file ... ] cut -f list [ -d delim ] [ file ...] -c list 以字符为主,作剪切操作 -f list 以字段为主,作剪切操作
提取字段或列
#第一列 cut -f1 filenam #第二三列 cut -f2,3 filename
提取补集
cut -f1 --complement filename
指定字段分隔符
cut -d ";" -f2 filename cut -d : -f 1,5 /etc/passwd
指定字符
-b 字节 -c 字符 -f 字段 cut -c1-5 filename N- N-M -M ls -l | cut -c 1-10
指定输出分隔符
cut -c1-3,6-9 --output-delimiter ","
join
语法
join [options] file1 file2 选项 -1 field1 -2 field2 -o file.field -t separator
例子
join file1 file2
sed
sed(Stream editor)流编辑器, 可以配合正则使用, 进行替换等
sed替换语法
sed 's/pattern/replace_string/' file
将结果直接运用于源文件
-i 用于, 直接修改源文件 替换第一个 sed -i 's/pattern/replace_string/' file 替换第二个 sed -i 's/pattern/replace_string/2' file 替换所有 sed -i 's/pattern/replace_string/g' file 从第N处开始替换 sed -i 's/pattern/replcae_string/2g' file
移除空白行
sed '/^$/d' file
已匹配字符串标记
引用匹配到的 sed 's/\w\+/[&]/g' filename
组合多个表达式
sed 'exp1' | sed 'exp2' 等价 sed 'exp1;exp2'
使用引用
sed "s/$text/HELLO/"
子串匹配标记(后向引用,最多9个)
sed 's/\([a-z]\+\)' \([A-Z\]\+\)/\2 \1/' filename
保存到文件
sed 's/pattern/replacement/' -i outfile
使用其他分隔符
sed 's#/home/#/tmp/#'
awk
基本结构
awk -F '-' 'BEGIN{statements} {statements} END{statements}' file 表达式中单引号可以换成双引号 BEGIN -> 每一行,执行statements, 执行END
打印某一列
awk -F '-' '{print $0}' file #全部 awk -F '-' '{print $2}' file #第二列
print拼接字符
awk '{var="v1"; var1="v2"; print var1"-"var2;}'
特殊变量
NR nuber of records, 记录数 NF number of fields, 字段数 $0 当前行文本 $1 第一字段 $2 第二字段 $NF 最后一个字段 FILENAME 当前输入文件的名称 FNR 当前输入文件记录数 FS 字段分隔字符 OFS 输出字段分隔符,默认" " ORS 输出记录分隔符,默认"\n"
统计行数
awk 'END{print NF}'
将外部变量值传递给awk
awk -v VARIABLE=$VAR '{ print VARIABLE }' awk '{print v1, v2}' v1=$var1 v2=$var2
读取行
seq 5 | awk '{ getline var; print var}'
进行行过滤
awk 'NR<5' #行号小于5 awk 'NR==1,NR==4' #行号在1到5之间 awk '/linux/' #包含样式linux awk '!/linux/' #不包含 awk '$1 ~/jones/' #第一个字段包含jones tail file awk 'NR <= 10' file
设定分隔符
awk -F: '{ print $NF }' file
设定输出分隔符
awk -F: -v "OFS=-" '{print $1,$2}' /etc/passwd
打印空行
awk 'NF>0 {print $0}' or awk 'NF>0' #未指定action默认打印
print和printf
awk -F: '{print "User", $1, "is really", $5}' /etc/passwd awk -F: '{printf "User %s is really %s\n", $1, $5}' /etc/passwd
awk中使用循环
for(i=0;i<10;i++) { print $i; } for(i in array) { print array[i] }
内建函数
length(str) index(str,search_str) split(str,array,delimiter) 用界定符生成一个字符串列表 substr(string, start, end) #子串 sub(regex, replacement_str, str) #正则替换首个匹配位置 gsub(regex, replacement_str, string) #最后一个匹配位置 match(string, regex) #检查是否能够匹配字符串 tolower(string) #转小写 toupper(string) #转大写
写成脚本文件
BEGIN {} pattern1 {action1} pattern2 {action2} END {}
文件迭代
读文件行
while read line; do echo $line; done < file.txt
迭代每个单词
for word in $line; do echo $word; done
迭代每一个字符
for((i=0;i<${#word};i++)) do echo ${word:i:1} ; done
paste
按列合并文件
paste file1 file2 file3
指定分隔符
paste file1 file2 -d ','
tac
逆序打印
tac file1 file2
rev
接收一个文件或stdin作为输入, 逆序打印每一行内容
echo "abc" | rev
wget
Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTP, HTTPS, FTP协议和 HTTP 代理(选项多, 用法灵活)
一个用于文件下载的命令行工具
wget URL1 URL2
指定保存文件名
wget URL -O local.txt
指定日志,默认达到stdout
wget URL -O local.txt -o log.txt
指定重复尝试次数
wget -t 5 URL
下载限速
wget --limit-rate 20k url
指定限额
wget -Q 100m url
断点续传
wget -c URL $ wget -c -t 100 -T 120 http://www.linux.com/xxxx.data 当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。 wget的断点续传是自动的。 -c 选项的作用为断点续传。 -t 参数表示重试次数(例如重试100次,-t 100,如果设成-t 0,表示无穷次重试,直到连接成功) -T 参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时
复制或镜像整个网站
wget --mirror exampledomain.com wget -r -N -l DEPTH URL 递归,允许对文件使用时间戳,层级 $ wget -r -np -nd http://www.linux.com/packs/ -np 的作用是不遍历父目录 -nd 表示不在本机重新创建目录结构
访问需要认证的HTTP/FTP
wget --user username --password pass URL
post请求
wget url -post-data "name=value" -O output.html
批量下载
wget -i downloads.txt #将文件地址写入一个文件
用wget命令执行ftp下载
wget -m ftp://username:password@hostname
curl
基本用法
curl url > index.html
不显示进度信息
curl URL --slient
将内容写入文件,而非标准输出
curl URL --slient -O
写入指定文件
curl URL --slient -o filename
显示进度条
curl url -o index.html --progress
断点续传
curl -C - URL
设置参照页字符串
curl --referer Referer_URL target_URL 跳转到target_URL,其头部referer为Referer_URL
设置cookie
curl url --cookie "user=slynux;pass=hack" 另存为一个文件 curl URL --cookie-jar cookie_file
设置用户代理
curl URL --user-agent "Mozilla/5.0" 头部信息 curl -H "Host: www.slynux.org" -H "Accept-language: en" url
限定下载带宽
curl url --limit-rate 20k
指定最大下载量(可下载的最大文件大小)
curl url --max-filesize bytes 超出限制的话,返回非0
进行认证
curl -u user:pass url
只打印头部信息,不下载远程文件
curl -I url curl -head url
发送post请求
curl URL -d "va1=1&va2=2" --data
lynx
将网页以ascii字符形式下载
lynx -dump URL > webpage_as_text.txt
打印出网站的文本板块而非html
lynx -dump url
生成信息文件
lynx -traversal url
tar
“tar”命令是磁带归档(Tape Archive),对创建一些文件的的归档和它们的解压很有用。
将多个文件和文件夹保存成单个文件, 同时还能保留所有的文件属性
对文件进行归档
-c create file,创建文件 -f specify filename,指定文件名 tar -cf output.tar file1 file2 file3 tar -cf output.tar *.txt tar -cvf output.tar *.txt
向归档中追加文件
tar -rvf original.tar new_file -r,追加
查看过程中更多信息
tar -tvvf archive.tar -v/-vv, verbose
提取文件或文件夹
-x, exact tar -xf archive.tar -C,指定文件 tar -xf archive.tar -C /path/to/extraction_directory tar -xvf archive.tar
提取指定文件
tar -xvf file.tar file1 file4
拼接两个归档文件
tar -Af file1.tar file2.tar #file2合并到file1中
只有在文件内容修改时间更新(newer),才进行添加
tar -uvvf archive.tar filea
比较归档文件与文件系统中的内容
tar -df archive.tar filename1 filename2
从归档文件中删除文件
tar -f archive.tar --delete file1 file2
提取到某个目录
tar zxvf package.tar.gz -C new_dir
压缩归档文件
gzip/gunzip -> .gz f.tar.gz -z tar -czvf tar -xzvf bzip/bunzip -> .bz2 f.tar.bz2 -j f.tar.lzma --lzma f.tar.lzo
从归档中排除部分文件
tar -cf arch.tar * --exclude "*.txt" cat list filea fileb tar -cf arch.tar * -X list
排除版本控制文件
tar --exclude-vcs -czvvf source.tar.gz files
打印总字节数
tar -cf arc.tar * --exclude "*.txt" --totals
cpio
使用频率不高
归档,保留文件属性(权限、所有权等)
echo file1 file2 | cpio -ov > archive.cpio -o 指定输出 -v 打印归档文件列表
列出cpio中的文件内容
cpio -it < archive.cpio -i指定输入 -t列出归档文件中的内容
gzip
压缩,会删除源文件
gzip filename #got filename.gz
解压
gunzip filename.gz
列出文件属性信息
gzip -l text.gz
stdin读入文件并写出到stdout
cat file | gzip -c > file.gz
压缩归档文件
tar -czvvf archive.tar.gz [files] or tar -cvvf archive.tar.gz [files] gzip archive.tar
指定压缩率
1-9,1最低,但速度最快 gzip -9 test.img
zcat
无需解压缩,直接从.gz中提取内容
zcat test.gz
bzip
更大的压缩率
bzip2 filename
解压缩
bunzip2 filename.bz2
stdin到stdout
cat file > bzip2 -c > file.tar.bz2
压缩归档
tar -cjvvf archive.tar.bz2 [files] or tar -cvvf archive.tar [files] bzip2 archive.tar
保留输入文件
bunzip2 test.bz2 -k
压缩率
bzip2 -9 test.img
lzma
比gzip/bzip2更好的压缩率
压缩
lzma filename
解压
unlzma filename.lzma
stdin到stdout
cat file | lzma -c > file.lzma
创建归档
tar -cavvf archive.tar.lzma [files] -xavf
保留输入文件
lzma test.bz2 -k
压缩率
lzma -9 test.img
zip
压缩
zip archive_name.zip [source files/dirs]
对目录和文件进行递归操作
zip -r archive.zip folder1 file2
base64
编码
base64 filename > outfile cat file | base64 > outfile
解码
base64 -d file > outfile
md5sum
“md5sum”就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。
单向散列
md5sum file sha1sum file
rsync
可以对位于不同位置的文件和目录进行备份, 借助差异计算和压缩技术实现最小化数据传输量
要确保远端安装了 openssh
从一个目录复制到另一个目录
rsync -av source_path dest_path -a 进行归档 -v打印细节 路径可以使本地,也可以是远端路径 e.g. rsync -av /home/test /home/backups/ #复制到backups目录下 rsync -av /home/test /home/backups #创建backups目录, 复制
备份到远程服务器
rsync -av source_path user@host:PATH 可以反向
改善传输速度
rsync -avz source destination
排除文件
rsync -avz source dest --exclude "*.txt" --exclude-from FILEPATH FILEPATH: *.bak
更新备份时,删除不存在的文件
rsync -avz source dest --delete
git
初始化目录
git init
配置用户信息
git config --global user.name "wklken" git config --global user.email "wklken@yeah.net"
加到远端
git remote add origin user@remotehost:/home/backup/backup.git git push origin master
添加
git add *
删除
git rm *.py
标记一个检查点
git commit -m "Commit message"
查看日志
git log
回滚到某个版本
git checkout hashid [ filename ]
克隆
git clone url
dd
Dtat Definiton, 要注意参数顺序, 错误的参数会损毁所有数据
可以用来转换和复制文件,大多数时间是用来复制iso文件(或任何其它文件)到一个usb设备(或任何其它地方)中去,所以可以用来制作USB启动器
语法说明
dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT if/of 输入/输出文件或设备路径 bs块大小 count 限制复制到目标的字节数 dd if=/dev/zero of=/dev/sda1 #制作iso 从cdrom设备读取所有数据, 创建iso文件 dd if=/dev/cdrom of=cdrom.iso
备份恢复
dd if=/dev/sda1 of=x.img dd if=x.img of=/dev/sda1
mount
mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。在插入你的文件系统后,
mount --bind /source /destination 首先运行”lsblk”命令,识别出你的设备,然后把分配的设备名记下来。 root@tecmint:~# lsblk 创建一个任何名字的目录,但是最好和引用相关。 root@tecmint:~# su Password: root@tecmint:~# cd /dev root@tecmint:~# mkdir usb 现在将“sdb1”文件系统挂载到“usb”目录. root@tecmint:~# mount /dev/sdb1 /dev/usb
挂载镜像
mount -o loop file.img /mnt/mount_point
网络相关
ifconfig
显示网络接口、子网掩码等详细信息
ifconfig /sbin/ifconfig
打印某个特定网络接口
ifconfig iface_name e.g. ifconfig en1 HWaddr MAC地址 inet addr ip地址 Bcast 广播地址 Mask 子网掩码
设置网络接口ip
ifconfig wlan0 192.168.0.80
dns
cat /etc/resolv.conf host google.com #Dns查找 nslookup google.com #更详细信息
修改dns/host
echo nameserver IP_ADDRESS >> /etc/resolv.conf echo ip domain >> /etc/hosts
ping
ping www.baidu.com
路由信息
显示路由表 route 以数字形式显示地址 route -n
设置默认网关
route add default gw 192.168.0.1 wlan0
trace_route, 显示分组途径的所有网关的地址
traceroute google.com
ping
基本
ping ADDRESS #主机名,域名或ip
PING命令可以得到RTT(Round Trip Time), 分组从源到目的主机的往返时间, 单位ms
限制发送分组数
ping ADDRESS -c COUNT ping
fping
同时ping一组ip, 而且响应非常快
fping -a ip1 ip2 -g fping -a 192.160.1/24 -g fping -a < ip.list -a, 所有活动主机的ip -g, 从IP/mask生成的ip地址范围
进行dns查询
fping -a -d 2 > /dev/null < ip.list
lftp
基本用法
lftp username@ftphost cd dir lcd改变本地主机目录 mkdir 创建目录 get/put 下载上传 quit退出
scp
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。
linux的scp命令可以在linux服务器之间复制文件和目录.
拷贝文件
scp filename user@remotehost:/home/pat ip或主机名均可 scp SOURCE DESTINATION
递归复制
scp -r dir1 user@remotehost:/home/backup
提高拷贝速度
scp -c arcfour -r -P20755 dir/ 192.168.2.*:/**/**/data/ -c arcfour 这个算法没有加校验不保证完整性,注意慎用,内网1000M带宽,默认算法速度只能达到30M/s,用arcfour这个算法速度可以达到50-80M/s
SSH
连接远程
ssh username@remote_host ssh -p port username@remote_host
执行命令
ssh username@remote_host 'cmd1; cmd2' > stdout.txt 2>errors.txt
压缩功能
ssh -C user@hostname 'cmds'
打通ssh
1.创建SSH密钥 ssh-keygen -t rsa 公钥, ~/.ssh/id_rsa.pub 2.登陆远端服务器, 将公钥写入 ~/.ssh/authorized_keys
lsof
列出系统中开放端口及运行在端口上的服务
lsof -i
配合grep, 获取需要的信息
netstat
查看开放端口和服务
netstat -tnp
磁盘和系统
du
du = disk usage
估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。
查看占用磁盘空间
du FILENAME1 FILENAME2
查看目录
du -a dir
以KB,MB或块为单位展示
du -h FILENAME1
显示总计情况
du -c FILENAME1
只显示合计
du -s FILENAME1
以特定单位打印
du -b/-k/-m/-B FILES
排除部分文件
du --exclude "*.txt" DIR --exclude-from EXCLUDE.txt DIR
指定最深层级
du --max-depth 2 DIR
指定目录最大的10个文件
du -ak S_DIR | sort -nrk 1 | head
df
df = disk free
报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。
查看磁盘可用空间
df df -h
time
计算命令执行时间
time COMMAND real 挂钟时间, 从开始执行到结束的时间 user 进程花费在用户模式中的cpu时间, 真正用于执行进程所花得时间 sys 进程花费在内核模式中的cpu时间
写入文件
time -o output.txt COMMAND time -a output.txt COMMAND #追加
格式化输出
time -f "Time: %U" -a -o timing.log uname real %e user %U sys %S
who
获取当前用户登陆信息
who / w
当前登陆主机的用户列表
users
uptime
查看系统已经通电运行多长时间了
uptime #也可以看到负载
last
显示上次用户登录信息- 前一次启动会话信息
last
获取单个用户
last USER
watch
在终端中以固定间隔监视命令输出
#default 2s watch ls # 5s watch -n 5 ls
颜色标示
watch -d 'COMMAND'
进程和线程
ps
ps命令给出正在运行的某个进程的状态,每个进程有特定的id成为PID。
ps命令主要查看系统中进程的状态
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND USER表示启动进程用户 PID表示进程标志号 %CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例 %MEM表示该进程占用内存和总内存的比例。 VSZ表示占用的虚拟内存大小,以KB为单位。 RSS为进程占用的物理内存值,以KB为单位。 TTY表示该进程建立时所对应的终端,"?"表示该进程不占用终端。 STAT表示进程的运行状态,包括以下几种代码: D,不可中断的睡眠; R,就绪(在可运行队列中); S,睡眠; T,被跟踪或停止; Z,终止(僵死)的进程,Z不存在,但暂时无法消除; W,没有足够的内存分页可分配;<高优先序的进程; N,低优先序的进程; L,有内存分页分配并锁在内存体内(实时系统或I/O)。 START为进程开始时间。 TIME为执行的时间。 COMMAND是对应的命令名。
查看进程信息
#当前终端 ps PID TTY TIME CMD PID 进程ID TTY 终端 TIME 进程启动后过去的时间 CMD 进程对应的命令
显示更多信息
#当前终端 ps -f
查看所有进程
ps aux ps -ef
查看某个用户的所有进程
ps U ken
命令格式
ps [OTHER OPTIONS] -o par1,par2,par3 ps -eo comm,pcpu | head pmem 内存使用率,comm可执行文件名,user启动进程的用户,etime启动后度过的时间
设置升序降序
ps -eo comm,pcpu --sort -pcpu | head +升序,-降序
找出给定命令名对应进程ID
ps -C COMMAND_NAME ps -C bash -o pid=
进程线程相关
ps -eLf --sort -nlwp | head
查看子进程树
ps axwef
注意:当你要知道有哪些进程在运行或者需要知道想杀死的进程PID时ps命令很管用。你可以把它与‘grep‘合用来查询指定的输出结果,例如:
# ps -A | grep -i ssh
pgrep
pgrep只需要命令名的一部分, ps需要准确的全名
基本用法
pgrep bash
指定进程的用户
pgrep -u root,slynux COMMAND
返回匹配进程数
pgrep -c COMANND
top
查看占用cpu最多的进程列表
top
kill
kill是用来杀死已经无关紧要或者没有响应的进程,杀死一个进程需要知道进程的PID
列出可用信号
kill -l
终止一个进程
kill PROCESS_ID_LIST
强杀进程
kill -9 PROCESS_ID
杀死一组命令
killall process_name killall -9 process_name 指定用户 killall -u USERNAME process_name
pkill
杀,接受进程名
pkill process_name pkill -s SIGNAL process_name
which
查找PATH下某个命令位置
which ls
whereis
whereis的作用是用来定位命令的二进制文件\资源\或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页:
whereis ls whereis kill
类似which,多了命令手册位置,源代码位置
注意:当需要知道二进制文件保存位置时有用.
file
确定文件类型
whatis
对命令的简短描述
hostname
当前主机名
uname
主机名 uname -n #内核版本,硬件架构等 uname -a #内核发行版本 uname -r 主机类型(32位/64位) uname -m cpu相关信息 cat /proc/cpuinfo 内存信息 cat /proc/meminfo
例子
#uname -a Linux tecmint 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:36:13 UTC 2013 i686 i686 i686 GNU/Linux 1. “Linux“: 机器的内核名 2. “tecmint“: 机器的分支名 3. “3.8.0-19-generic“: 内核发布版本 4. “#30-Ubuntu SMP“: 内核版本 5. “i686“: 处理器架构 6. “GNU/Linux“: 操作系统名
crontab
格式
* * * * * cmd 分钟(0-59),小时(0-23),天(1-31),月份(1-12),工作日(0-6) A,B A and B */C every C
查看
crontab -l crontab -l -u slynux
编辑
crontab -e
移除
crontab -r crontab -u slynux -r
可以在crontab 中加入环境变量
getopts
命令行参数处理
while getopts :f:vql opt do case $opt in f) file=$OPTARG ;; v) verbose=true ;; ....
history
“history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史
history
注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以你写命令时自动补全
sudo
“sudo”(super user do)命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。
注意:sudo 允许用户借用超级用户的权限,然而”su”命令实际上是允许用户以超级用户登录。所以sudo比su更安全。并不建议使用sudo或者su来处理日常用途,因为它可能导致严重的错误如果你意外的做错了事,这就是为什么在linux社区流行一句话:
“To err is human, but to really foul up everything, you need root password.”“人非圣贤孰能无过,但是拥有root密码就真的万劫不复了。”
cal
“cal”(Calender),它用来显示当前月份或者未来或者过去任何年份中的月份
cal cal 02 1835
cp
“copy”就是复制。它会从一个地方复制一个文件到另外一个地方
cp file1 file2 cp -r dir1 dir2
快速备份一个文件:
cp some_file_name{,.bkp}
注意: cp,在shell脚本中是最常用的一个命令,而且它可以使用通配符(在前面一块中有所描述),来定制所需的文件的复制。
mv
“mv”命令将一个地方的文件移动到另外一个地方去。
“mv”命令将一个地方的文件移动到另外一个地方去。
pwd
“pwd”(print working directory),在终端中显示当前工作目录的全路径。
注意: 这个命令并不会在脚本中经常使用,但是对于新手,当从连接到nux很久后在终端中迷失了路径,这绝对是救命稻草。
free
free -m total used free shared buffers cached Mem: 7982 6811 1171 0 350 5114 -/+ buffers/cache: 1346 6636 Swap: 16935 11 16924
显示剩余内存
free -m | grep cache | awk '/[0-9]/{ print $4" MB" }'
在这里例子中,应用程序只使用了1346MB内存,还有6636MB空闲内存可以使用.
一些简单的计算方法:
物理已用内存 = 实际已用内存 - 缓冲 - 缓存 = 6811M - 350M - 5114M
物理空闲内存 = 总物理内存 - 实际已用内存 + 缓冲 + 缓存
应用程序可用空闲内存 = 总物理内存 - 实际已用内存
应用程序已用内存 = 实际已用内存 - 缓冲 - 缓存
原始解释:转至互联网:Linux的基本原则是没有资源应该被浪费.因此核心会使用尽可能多的RAM,来缓存来自本地和远程的文件系统的信息.系统做读写操作的时候,会将与当前运行的进程相关的数据尽量存储在RAM里.系统报告的缓存是缓冲和页缓存两者之和.缓存并不是在进程结束的时候被回收(你可能很快会启动另外一个进程,需要同样的数据),而是随需回收–比如,当你启动一个需要大量内存的进程时,Linux核心会从内存中回收缓存,将得到的内存分配给新的进程.
有些区域,比如匿名内存映射(mmps)和共享内存区域,它们被报告为缓存,但不是被核心直接释放.一般的缓存不映射到进程的地址空间,仅仅是简单的核心映射,而这些特别的缓存映射到所有挂接到它们上面的进程.
eval
eval "ls -l"
basename
获取路径中文件部分
basename resolv.conf #resolv.conf basename /etc/resolv.conf # resolv.conf
cmp
比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。
cmp file1 file2 diff file1 file2
rm
‘rm’ 标准移除命令。 rm 可以用来删除文件和目录
rm file1 rm -r dir1 #递归删除空目录
强删
rm -rf fileordir
警告: ”rm -rf” 命令是一个破坏性的命令,假如你不小心删除一个错误的目录。一旦你使用’rm -rf’ 删除一个目录,在目录中所有的文件包括目录本身会被永久的删除,所以使用这个命令要非常小心。
service
‘service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。
注意:要想使用service命令,进程的脚本必须放在‘/etc/init.d‘,并且路径必须在指定的位置。如果要运行“service apache2 start”实际上实在执行“service /etc/init.d/apache2 start”.
man
‘man‘是系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页
man thecommand
注意:系统帮助页是为了命令的使用和学习而设计的。
passwd
这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。
gcc
gcc 是Linux环境下C语言的内建编译器。下面是一个简单的C程序,在桌面上保存为Hello.c (记住必须要有‘.c‘扩展名
gcc Hello.c ./a.out gcc -o Hello Hello.c ./Hello
注意: 编译C程序时,输出会自动保存到一个名为“a.out”的新文件,因此每次编译C程序 “a.out”都会被修改。因此编译期间最好定义输出文件名.,这样就不会有覆盖输出文件的风险了。
g++
g++是C++的内建编译器
g++ Add.cpp ./a.out g++ -o Add Add.cpp ./Add
java
Java 是世界上使用最广泛的编程语言之一. 它也被认为是高效, 安全和可靠的编程语言. 现在大多数基于网络的服务都使用Java实现.
javac tecmint.java java tecmint
注意: 几乎所有的Linux发行版都带有gcc编译器, 大多数发行版都内建了g++ 和 java 编译器, 有些也可能没有. 你可以用apt 或 yum 安装需要的包.
关于/dev/null
特别有用的特殊文件,位桶,传送到此文件的数据都会被系统丢弃。
语言及乱码
查看变量值
echo $LANG 未设置任何LC_XXX时使用的默认值 echo $LC_ALL 覆盖所有LC_XXX变量,总控开关
好的做法是,避免为任何LC_XXX变量赋值,使用LC_ALL和LANG来控制
避免乱码:从编辑器到语言,再到系统,统一编码为UTF-8
shell的版本
bash --version