您的位置:首页 > 运维架构 > Shell

LINUX SHELL脚本攻略笔记[速查]

2015-08-31 21:07 597 查看
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

网络相关

ifconfig

ping

fping

lftp

scp

SSH

lsof

netstat

磁盘和系统

du

df

time

who

uptime

last

watch

进程和线程

ps

pgrep

top

kill

pkill

which

whereis

file

whatis

hostname

uname

crontab

getopts

history

sudo

cal

cp

mv

pwd

free

eval

basename

cmp

rm

service

man

passwd

gcc

g++

java

关于/dev/null

语言及乱码

shell的版本

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

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

资源

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

读取链接对应真是路径

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 fileawk '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
http://www.wklken.me/posts/2013/07/04/note-of-linux-shell-scripting-cookbook.html#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: