Linux Shell脚本攻略的笔记,markdown编写,可以速查(ctrl+f)

2013-09-08 从历史网摘中补充
2014-02-16 增加<>笔记补充


资源

sed简明教程

awk简明教程


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 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 递归遍历

前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