Linux 常用命令
相关内容:
1. 用which ls可以查看ls命令在哪里,一般在bin下。
2. 为外部命令,相对于Bash的内置命令,如while等。
3. 同名的内置命令比外部命令优先级高。
查看文件清单 ls
- ls -a :查看所有,包括隐藏文件和目录
- ls -lat : 查看所有文件的详细信息,按照修改时间排序。
- ls -lu : 查看访问时间
- ls -lc : 查看状态改动时间
- stat 可以直接看文件三种时间且更精确
total:一共占几个block,在linux中一个block的大小是512b。
第一列前十个字符中:
- 1表示类型:d 目录;l 符号链接; - 普通文件
- 2-4个表示文件所有者权限:r 读; w 写; x 执行
- 5-7表示文件所属组其他账户权限
- 8-10表示所有不同组的其他账户权限
第二列:对文件表示硬链接数;对目录表示所含子目录数(包括隐藏目录)
第三列:文件所有者
第四列:所有者所属组
第五列:字节数
第六列:文件修改时间
第七列:文件名
浏览文件 cat,more,less,head,tail
文件统计 wc
stark@ubuntu:~$ wc /etc/passwd
40 69 2241 /etc/passwd
行 单词数 字节数(换行符‘\n’也算一个字节)
改变当前目录 cd
- cd .. :进入父目录
- cd ../..:上两级
- cd - :返回刚才路径
- cd ~stark :进入账户名为stark的账户主目录
创建目录 mkdir
- mkdir -p test1/test2 :一口气创建2个目录
复制 cp
- cp -r dir1 dir2 : 递归复制文件夹
- cp -b a.txt b.txt : 若已存在 b.txt 则将原来的 b.txt 备份为 b.txt.~,防止意外覆盖
- cp -f a.txt b.txt : 强行拷贝,当账户对b.txt没有写权限时使用,没有提示
- cp -i a.txt b.txt : 与上面一样,但有提示
重命名或移动 mv
- mv file1 file2 :重命名
- mv -b file1 file2 : 备份重命名
- mv file1 dir1 : 移动到某一目录
创建符号链接和硬链接 ln
符号链接:和windows的快捷方式差不多,字节数为源文件名
- ln -s a.txt b.txt : 创建b.txt为a.txt的符号链接,a.txt不存在时也可执行(断链,符号链接为红色)
- rm b.txt : 删除该符号链接
注:删除原文件后,将不可打开链接文件。
硬链接:和普通文件一样,创建前源文件必须存在,两者状态一致(除了名字外全部一致,包括权限等等)
-ln a.txt b.txt
显示当前目录 pwd
产生空文件或改变文件时间戳 touch
- 文件存在:改变修改时间为当前时间
- 文件不存在:创建一个文件
查看账户名及其所属组 whoami,id,groups
改变权限 chmod
[ugoa][+-=][rwx-]
u用户,g组,o其他账户,a所有账户;
也可用数字表示权限
SUID SGID SBIT
删除
- rm file:删除文件
- rm -r dir : 递归删除非空目录
- rm -rf dir : 去掉权限保护提示‘确认删除?’,直接进行删除(用于文件件有只读文件)
- rmdir dir : 删除空目录(不常用)
查看文件类型 file
树状目录 tree
Bash内置命令与环境
命令行提示 PS1
可改,形式:
PS1=".."
这是一个变量,用set可以看到所有全局变量和函数;用env或printenv看环境变量。
环境变量 PATH
查看
echo $PATH
结果以冒号隔开
添加
$PATH="$PATH:/tmp/bin"
主目录下.bashrc
隐藏文件用于设置自己的环境配置,包括PS1..,每次打开命令行都会执行。
设置和取消别名 alias,unalias
alias ls="ls -lat"
unalias ls
权限掩码命令 umask
在复制时,掩码的作用是拿走能够拿走的权限。
改变命令解释顺序
- command <命令>:按照内置和外部命令来处理。
- builtin <命令>:只查找内置命令。
- enable <命令>:禁用(-n)或使能内置命令 。
重名时,Bash命令解释顺序:
alias->keyword->function->built-in->$PATH
即:
别名->关键字->函数->内置命令->外部命令
查询命令类型:
type -t <命令>
命令退出状态&命令的true和false
每一个命令或程序结束后都会返回一个退出状态,0-255。0为成功,其余均失败,127未找到命令。
内置变量&?
存储着上一条命令的退出状态。
特殊内置指令:均不执行任何操作,true返回0,false返回1。
管道
左边执行结果通过管道(|)传给右边执行
Ex. ls -la|more
分页查看文件信息
输入输出
执行一个shell文件自动打开标准输入文件(stdin)和标准输出文件(stdout),分别对应终端键盘和终端屏幕,对应文件描述符0和1。
wc <文件>,文件是输入,行数(有几个回车就有几行)、单词数、字节数是输出。
标准输入如:
wc 回车 然后写内容
命令的进一步讨论
命令的后台执行
末尾加 &
cp a.txt b.txt &
[1] 6170
一个工作号 一个进程号
续行
续行符 \
echo “ss\
>sad”
sssad
这里的>即是PS2的值。
命令的自动补全
<Tab>
windows linux 文件互转
windows下,文件换行符为\r\n
linux下,是\n
用命令dos2unix
进行转换。
子shell
小括号括起来的命令是在子shell中执行的,用ps命令可以看到当前进程状态。
变量
定义与清除
$age=21
$echo $age
21
$unset age
$echo $age
#空行
$
单引号与双引号
单引号里面的变量将不带入值,原封不动输出。双引号会带入。
大括号
- 大括号是变量名字的定界符
- 分配?
$ echo a{b,c}d
abd acd
$ mkdir test/{1,2,3}
一下子建三个子目录
将命令结果赋给变量
- a=`date`
- a=$(date)
也可放于另一指令中:
$ echo Now,time is $(date)
键盘输入变量值 read
$ read var
xxx
$ echo $var
xxx
当未指定变量名称时,将输入的值放入内置变量REPLY中。
$ read -t 5 -p "input a number:" num
设置5秒,超时未输入则退出该命令,内置变量TMOUT为超时时间,默认没有值,如果该值大于0,则在等待该时间后没有收到任何输入,当前命令/shell会自动退出。
此外 -n 来限制输入个数;-s 输入看不到(输密码);-u fd 用文件描述符给变量赋值。
整型变量运算
- 用双括号
((z=x+y))
- 用let
let z=x+y
Bash只有整型数,无法整除时丢弃小数点后面的数。
若要进行浮点运算,要使用bc或awk.
从本质上来说,Bash只有字符型变量,整型(integer)只作为一种属性,此外,还有只读(readonly)属性,数组属性(array)等,分别可以用declare -i / declare -r /declare -a 来赋予。
导出变量 export 或 declare -x
由于子shell中默认无法继承父shell的变量,可以用export var来实现继承,对子shell的子shell…都有效。为什么叫export呢?
实际上,用set可以看到当前shell的按照字母排序的所有普通变量、数组、环境变量和函数定义等。
数组
Bash只支持一维数组。
创建
y=(aa bb cc)
read -a y
aa bb cc
查看
${y[*]}
查看所有元素
${#y[*]}
查看数组长度
declare -p y
查看数组状态
关联数组
和字典一样,索引可以不是数字
declare -A age=([Mike]=11,[Jack]=22,[Tom]=20)
字符串操作
awk与sed工具可以实现更多操作,但就运行效率来讲没有内置的操作快。
if
if 命令
then
命令组
fi
或
if 命令; then 命令组; fi
注意:Bash中作为判断的可以是任意语句,因为if是根据命令的返回状态来进行判别的,单纯的if expr 4 + 3 也是可以的,因为他计算成功返回0,如:
$ if expr 5 + 1 > temp;then echo "5+1=$(<temp)";fi
5+1=6
case
case 变量 in
模式[|模式…])
命令组;;
模式[|模式…])
命令组;;
…
esac
用exit退出当前shell。退出状态默认是上一条语句的,也可自带参数表示exit退出状态。
for
for 变量 [ in 列表 ]
do
命令组
done
或
for (( 表达式1;表达式2;表达式3));do 命令组;done
其他常用命令
计算表达式值 expr
expr表达式中运算符两边必须有空格(否则误认为字符串?)
$ expr 3 + 1
4
$ expr "a.txt" : '.*\.\(.*\)
txt'
提取后缀名。
条件判断 test
两种方式,用$?
看返回状态,1为false,0为true.
- test 10 -lt 20
10小于20?
-[ 10 -lt 20 ]
表达式与前后中括号之间要有空格,为什么呢?因为bash中[
也是一个内置命令,故 [4
就找不到命令了。
-$ [ \("abc" \< "efg" \) -a \(10 -le 20\)]
一个中括号内使用小括号大于小于要加反斜杠,等价于:$ [[ "abc" < "efg" && 10 -le 20 ]]
判断变量是否定义
1. set里面找
2. test -v 变量
3. [ -v 变量 ]
移动位置参数 shift
Bash有特殊变量 $N
表示脚本或函数的位置参数,用 $#
显示位置参数个数,$
带头的还有很多特殊变量,不赘述。那么shift的作用是将位置参数左移一个,见:
$ cat shift.txt
#!/bin/bash
while [ $# -gt 0 ]
do
echo $1
shift
done
$ sh shift.txt 10 20 30
10
20
30
<CTRL+D> & <CTRL+C>区别
<CTRL+D>
是Linux下的EOF,退出一个命令;
<CTRL+C>
比较强制,退出整个shell。
select & case 配合
$ cat select.txt
#!/bin/bash
PS3="please select your favorite vegetable:"
select vegetable in "bean" "tomato" "carrot" "onion"
do
case $REPLY in
1|3)
echo "you select $vegetable, the price is 2.22"
break ;;
2|4)
echo "you select $vegetable, the price is 3.22"
break ;;
*)
echo "input error!"
;;
esac
done
这里,在select命令运行时,会自动给列表里面的每个变量加上编号,用户选择的编号会存放于内置变量REPLY中,故可以用$REPLY来获得用户输入。
使脚本运行,若直接用sh select.txt
报错:select: not found
改成bash select.txt
则可以。这是为什么呢?
因为使用sh调用执行脚本相当于打开了bash的POSIX标准模式
(等效于bash的 –posix 参数)。一般的,sh是bash的“子集”。
获得多个参数的方法 getopts
当脚本要获得多个参数,然后对各个参数进行操作时,(就像 ls - l -a),一般方法:
· 用$1
每次提取第一个参数,配合使用shift,一个个进行处理,但遇到 ls -al
时便出问题了,难道每种排列组合都放到case?所以,一般使用下面方法:
· getopts 会对参数一个个进行提取,不废话,看例子更容易理解:
`$ cat getopts.txt
#!/bin/bash
while getopts aw: OPTION
do
case $OPTION in
a) echo Good afternoon!
;;
w) week=$OPTARG
echo "Week${week}!"
;;
*) echo "Usage is : $0 [-a] [-w number]"
exit 1;
;;
esac
done
w后面冒号表示这是个带参数的参数,该参数存于OPTARG内。
过滤器 grep & egrep
Bash 模式匹配 extglob
这并不是一个命令,而是一个选项,默认关闭,打开方式:
shopt -s extglob
例:
$ name=Tommy
$ shopt -s extglob
$ [[ $name == [Tt]o+(m)y ]]
$ echo $?
0
剪取内容 cut
合并相应行 paste
paste file1 file2 file3
结果 | ||
---|---|---|
file1第1行 | file2第1行 | file3第1行 |
file1第2行 | file2第2行 | file3第2行 |
… |
中间默认以Tab键隔开
转换或删除字符 tr
如大小写转换:
$ tr [a-z] [A-Z] <test.txt
排序 sort
默认以字符串方式进行排序,若要对数值进行排序,用-n
函数
基本形式
function 函数名
{
xxx
}
或
函数名()
{
xxx
}
写在一行时,大括号间需加空格,后括号的空格前还要加分号。
函数名(){ xxx; }
注:函数内变量默认和全局变量是一样的,除非加上local或declare。
declare -f 查看函数定义
流编辑器 sed
常用于字符串替换上,比vi方便。
替换 s
基本形式:
sed [选项] ‘s/regexp/replacement/flags’ file
$ echo "Linux Linux Linux" | sed 's/Linux/UBUNTU/1
UBUNTU Linux Linux
二次扫描 eval
第一次进行变量值替换,第二次将参数作为shell命令执行。
文本处理工具 awk
awk是以文本为驱动的,逐行扫描文本执行处理。
awk '命令' file
$ awk '{print $0}' awk.txt
Jack boy 89
Amy girl 90
Lucy girl 87
Mike boy 88
其中$0表示所有列
$ awk '{sum=sum+$3} END{print sum/NR}' awk.txt
88.5
相对于一般模块的每行执行,END后面模块最后执行,且仅最后执行一次,上面代码用于计算第三列平均值。
awk中的if
$ awk '{if($3>88){print $0}}' awk.txt
Jack boy 89
Amy girl 90
awk中的数学函数
$ awk 'BEGIN{print int(15.55),sqrt(3)}'
15 1.73205
int()函数取整;sqrt开方;BEGIN先于文本输入之前执行,故用BEGIN模块可以不用文本输入。
进程 & 作业
· ps查看进程;jobs查看作业
· 作业号仅在当前窗口有效;进程号在整个系统都有效
·
发送信号 kill
kill [-s 信号名 | -n 信号编号 | - 信号名 | - 信号编号 ] 作业号或进程ID
等待命令 wait
等待某一进程结束,不带参数时表示等待当前shell的所有子进程都结束。
捕获信号 trap
trap commands signals
表示当收到signals(空格间隔)时执行commands(分号间隔)
$ trap 'echo I stop now!;exit' 2
$ while(true) do echo "hhh";done
信号2是中断,也就是
遇到的问题
以独占方式锁定此配置文件失败
一般是前一次非正常关闭Ubuntu系统所致。
办法:
首先删除虚拟机Ubuntu系统目录下的以.lck结尾的文件夹,
之后windows下任务管理器,结束进程vmware-vmx.exe
即可。