linux入门,一些基本用法
1. 绝对路径/home/shizhe/workspace/m1.c(/home,~,/root)
相对路径shizhe/workspace/m1.c
2. ls 控制台或终端在某个时刻总是对应着一个工作目录,执行ls命令会将工作目录下的文件和子目录名称显示出来
3. cd 或 cd ~ 进入登录时的主目录
cd / 进入根目录
cd .. 进入上一级目录
cd /home 进入系统的home目录
cd home 进入当前目录下的home目录//无效
4. cat /dev/null >文件名 清空文件内容
5. 新建用户(user add)
useradd UserName
为用户添加密码(password)#
passwd UserName
删除用户(user delete)
userdel UserName
新建组群(group add)
groupadd GroupName
删除组群(group delete)
groupdel GroupName
whoami 当前用户身份
su UserName 切换用户
groups 查看当前登录用户的组内成员
groups gliethttp 查看gliethttp用户所在的组,以及组内成员
whoami 查看当前登录用户名
/etc/group文件包含所有组
/etc/shadow和/etc/passwd系统存在的所有用户名
6. 创建目录(make directory) mk:创建 dir:目录
mkdir DirecName
-p
删除目录(remove directory) re/rm -r:删除
-f 删除文件之前不提示任何确认信息
-r 递归删除目录下所有子目录的内容
rmdir DirecName
显示工作目录(print working directory)
pwd //像密码
7. 目录重命名(move) //不是rename mv:重命名
mv oldname newname
目录拷贝
cp -r menu newmenu 拷目录即内容 放到新目录下 -r :对目录及子目录操作
8. 新建文件touch vi cat mv
>FileName 或 touch FileName 或 vi FileName
删除文件(remove file) rm:删除
rm [选项] FileName
选项:-i 系统提示是否真要删除该文件
-f 删除文件之前不提示任何确认信息
文件拷贝(copy)
cp file menu 拷文件到目录 cp:拷贝 -r
cp file file 拷文件覆盖
文件链接(link)
ln –s oldfile newlink //是LN,似乎是快捷方式的意思 ln:文件链接
可以用ls -l查看
文件移动/重命名(move) mv:重命名/移动
mv oldname newname 将一个或多个文件移动到另外一个目录下,或者将一个文件重命名为另一个文件。
文件查找(find)
find 目录 显示目录下的多级结构(所有子目录和文件) find:目录查阅
文件内容查找(grep)
grep 内容 文档 确定内容的位置 grep:内容查找
9. 显示文件内容
more FileName 一次一屏的显示文件内容,空格或回车显示下一屏 more:一次一屏查看
less FileName 一次一屏的显示文件内容,空格或回车显示下一屏 less:功能更强大//就是不好用
cat FileName 一次全部显示文件的内容 cat:内容一次全部显示,但可操 作多个文件内容
cat file1 file2>file3 将file1、file2的内容写到file3,覆盖file3原内容
cat file1>>file2 将file1的内容追加到file2,file2原内容不变
head FileName 只显示文件的前10行 head与tail相反,一个显示头一 个显示尾
head –n FileName 显示文件的前n行
tail FileName 只显示文件的后10行
tail –n FileName 显示文件的后n行
nl FileName 以编号的形式一次全部显示文件的内容,忽略空格
10. 文件类型
- 普通文件
b 块设备文件
c 字符设备文件
d 目录
i 链接文件(快捷方式)
p 命名管道文件
s 本地套接口
ls -l查看
11. 修改权限
改变文件/目录的权限(change mode)
chmod [u/g/o/a] [+/-/=] [权限] FileName/DirecName
其中:+:增加指定的权限
-:去掉指定的权限
=:清除所选的权限并将其设置为制定的权限
chmod允许使用八进制符号作为模式,改变权限。
chmod PermissionCode FileName/DirecName
其中, PermissionCode 按如下方式计算
-421421421
chmod u+x myscript 由所有者执行
chmod a+x myscript 同组加上可执行权限
chmod 777 myscript 全部用户加上可执行权限
12 shell脚本
第一句必须指定解释的shell
#!/bin/sh
#开始为注释行
保留字符:$ * ' \ 使用\$转义
所有变量都是字符串类型,不用声明类型
三种变量:系统变量,环境变量,用户自定义变量
自定义:myvar="Hello,world" =两边不能有空格,$来引用
单引号‘’包括之中表示字符串,如果字符串包含保留字符,则保留字符失效,按原样输出
x=5;echo ‘x=$x’ 输出 x=$x
双引号“”包括之中表示字符串,如果字符串包含保留字符,则保留字符生效,如变量要显示变量值
x=5;echo “x=$x” 输出 x=5
运行时加./
一些系统变量
echo "the number of parameter is $# "; 命令行参数的个数
echo "the return code of last command is $?"; 前一个命令或函数的返回码
echo "the script name is $0 "; 当前程序的名称
echo "the parameters are $* ";以“参数1 参数2 ... ” 形式保存所有参数
xxx=10
echo "\$1 = $1 ; \$2 = $2 "; $n 表示第n个参数
echo "\$* = $*"
echo "\$@ = $@"以“参数1” “参数2” ... 形式保存所有参数
13 shell 表达式$((expr))
echo $((1+3))与let var=1+3; echo var等效
expr 把后面字符串当成数学表达式计算输出
例子,输出都是123 文件a.sh
a=123
b=$((100+23))
let c=100+23
d='100 + 23' //关键空格
echo $a
echo $b
echo $c
expr $d
进制转换$((原数字#进制))
14 shell流程控制 文件b.sh
条件语句 if/then/fi if/then/elif/fi //函数0为真,与c不一样
if true //=放在别的地方是赋值,放在if [ ] 里就是字符串等于
then echo "true" //=两边加空格
fi //if空格[空格$? -eq 0空格];
选择语句
case 字符串 in
模式1) command;;
模式2 ) command;;
…
esac
模式可以用通配符*
循环语句
for ((i=0;i<3;i++));do ;done //开始测试并不能用,要sudo dpkg-reconfigure dash 关掉dash才行
for x in 1 2 3;do ;done //x遍历in后面字符串
while
X=1;while (( X <= 10 ));do ;one //for的第一种
until //就是do-while,但条件写在前面了
15 shift命令(这里用于对命令行参数的处理)
原理:Shift命令每次把从命令行参数位置变量值取一个值出来,并且把总数减一
shift n 左移位操作,删除前面n位
例子 文件c.sh
#!/bin/bash
while [ $# != 0 ]
do
echo "第一个参数为:$1,参数个数为:$#"
shift
done
可以看出参数个数一直在减少,说明总数在减少,默认是shift 1
16 跳出机制(和c一样用于选择和循环但可以设置层数)
break [n] 中止循环过程的执行,并且跳到下一个命令。N表示跳出嵌套的层数
continue [n] 停止循环过程的当前一个反复并且跳到循环中的下一个反复过程的开始部分,n表示忽略的 层数
exit [n] 停止shell程序的执行,并且将返回值设置为n。
17 交互 文件:d.sh
read接收用户的输入 -p提供提示
select 表达式是一种bash的扩展应用,用户可以从一组不同的值中进行选择.会陷入循环,应有跳出语句
语句结构:
select var in 1 2 3 ; do
break
done
18 函数 文件:e.sh
与c一样,但不能有参数,具体看实例文件
19 检测某个进程是否正常工作
check_process.sh
检测磁盘空间是否足够,并报警
check_disk.sh //这俩没试出来,不知道怎么用
20 grep
用来截取内容,结合正则表达式后功能强大,类似mongodb模糊查询
grep [options] pattern files
参数
-c:只显示有多少行匹配,而不具体显示匹配的行 #看数目
-h:不显示文件名
-H:在每个符合的行前加上符合的文件名称
-i :在字符串比较的时候忽略大小写
-l:只显示包含匹配模板的行的文件名清单
-L:只显示不包含匹配模板的行的文件名清单
-n:在每一行前面打印该行在文件中的行数
-v:反向检索,只显示不匹配的行
-w:只显示完整单词的匹配
-x:只显示完整行的匹配
-q:不显示任何输出
-C:列出符合行外并列出上下各NUM行,默认为2
-B:列出符合行外并列出之前的NUM行
-A:列出符合行外并列出之后的NUM行
-E:扩展正则表达式
-r/-R:若是目录,则递归搜索其所有子目录和文件
退出状态 echo $?
0:成功
1:无法找到匹配的pattern
2:文件不存在
实例
$ grep NW file # 打印出file中所有包含NW的行
$ grep '^n' file # 打印出以n开头的行
$ grep '4$' file # 打印出以4结尾的行
$ grep '5\..' file # 打印出第一个字符是5,后面跟着一个.字符,后面是任意字符的行
$ grep '\.5' file # 打印出所有包含.5的行
$ grep '^[we]' file # 打印出所有以w或e开头的行
$ grep '[^0-9]' file # 打印出所有不是以0-9开头的行
$ grep '[A-Z] [A-Z]' file # 打印出所有前一个字符是大写,后跟一个空格及一个大写字母的行
$ grep '[a-z]\{9\}' file # 打印所有包含至少有9个连续小写字符的字符串的行
$ grep '\<north' file # 打印所有以north开头的单词的行
$ grep '\<north\>' file # 打印所有包含单词north的行
$ grep '^n\w*' file # 第一个字符是n,后面是任意字母或者数字
$ egrep 'NW|EA' file # 打印所有包含NW或EA的行。或grep -E
$ grep 'NW\|EA' file # 对于标准grep,若在扩展元字符前面加\,grep会自动启用-E
太简单了没试,它的功能awk和sed都能实现,具体要会正则表达式
21 awk脚本
awk代表三个作者的名字
基本语法
awk [option] 'pattern {action}' filename
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
原理
awk就相当于一个函数名
option 默认空格或跳格,自行设置,只能设一个
pattern 条件,可以写0/1,条件表达式,不支持t/f,默认为1,一般用正则表达式,或和内置变量组合来 达到目的,比如1<NR<2
action 命令,只改变输出不改变文件,语法趋于c和shell之间,有条件语句,循环语句,默认打印$0,但没有int等关键字
这个函数读入有'\n'换行符分割的一条记录,将记录按指定的域分隔符划分域,$0表示所有域, $1表示第 一个域,$n表示第n个域。 默认域分隔符是空格和跳格
作用
awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk将一行中分成数个“字段”来处理。适合处理小型数据
常用内置变量
$0表示整行, $n表示第n个分段
FILENAME表示文件名
NR是当前的行数number of row
FNR是文件中的行数
NF表示当前行有多少个段number of field
FS是是段分割符号, 默认情况下为空格filed separator
其他的自己查
内置函数
print/printf 不说了
length 字符串长度
sub/gsub(e,r,src) 对src查询到字符e然后r替换,字符要加"",可以处理后输出
substr(s,i,len) 截取s里i-len字段的字符串返回,只能输出处理后的
match(s,e) 返回s里首次遇到e的位置
tolower/toupper 切换小/大写
()是循环控制类的语块,如while,for,if,awk还有些内置函数也要用().如gsub() ,gensub()
{}是代码块,通常一个/PATTERN/会有块{}对应
[]里的内容是建立数组下标的时候用
;分隔多个命令
实例:
abc.awk
awk工具功能十分强大,且运行效率高,主要做分析和处理,grep和sed的功能awk都能实现
我是先学awk再学sed的,建议先学sed,降低awk难度
实例只介绍了中间语句块用法,
awk中间可以加三个语句块GEGIN{}{}END{},
BEGIN里的代码在读第一行前运行
中间的代码在读每一行时执行
END的代码在都完最后一行后执行
123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
L D Q D S B
yi|ge|sha|zi
#!/bin/sh
echo "awk '{print '$1'}' 123.txt"#输出每行第一域
awk '{print $1}' 123.txt
echo "awk '{print "run";print '$1'}' 123.txt"#每行都输出了run,可以看出awk函数是循环对每行进行判断和加工的
awk '{print "run";print $1}' 123.txt
echo "awk -F '|' '{print '$1'}' 123.txt"#在'{}'前设置option
awk -F '|' '{print $1}' 123.txt
echo "awk '{printf("%s\n", '$1')}' 123.txt"#可以用类似c的printf函数输出
awk '{printf("%s\t\n", $1)}' 123.txt
echo "awk '0{print '$1'}' 123.txt"#在''内{}前设置条件
awk '0{print $1}' 123.txt
echo "awk '1{print '$1'}' 123.txt"
awk '1{print $1}' 123.txt
echo "awk '1' 123.txt"
awk '1' 123.txt
echo "awk '1==2 {print '$1'}' 123.txt"
awk '1==2 {print $1}' 123.txt
echo "awk '{if(1)print '$1'}' 123.txt"#在'{}'内用if函数设置条件
awk '{if(1)print $1}' 123.txt
echo "awk '{if($1=="L")print '$0'}' 123.txt"
awk '{if($1=="L")print $0}' 123.txt
echo "awk '{if($1=="L"){print '$0'} else {print '$1'}}' 123.txt"
awk '{if($1=="L"){print $0} else {print $1}}' 123.txt
echo "awk '{if($1=="L"){a=1;print '$a'}}' 123.txt"#对比一下,看出语法区别,a不用int定义,也不用'$a'引用
awk '{if($1=="L"){a=1;print $a}}' 123.txt
echo "awk '{if($1=="L"){a=1;print a}}' 123.txt"
awk '{if($1=="L"){a=1;print a}}' 123.txt
echo "awk '{for(i=0;i<2;i++)print '$1'}' 123.txt"#循环语句
awk '{for(i=0;i<2;i++)print $1}' 123.txt
echo "awk '{print '$1','$2','FILENAME','NR','FNR'}' 123.txt"#可以这么些,顺便看看几个内置变量
awk '{print $1,$2,FILENAME,NR,FNR}' 123.txt
echo "awk '1<NR<3{print '$1'}' 123.txt"#对比一下,这么写和c是不同的
awk '1<NR<3{print $1}' 123.txt
echo "awk '1<NR&&NR<3{print '$1'}' 123.txt"
awk '1<NR&&NR<3{print $1}' 123.txt
echo "awk '/L/' 123.txt"#正则表达式筛选
awk '/L/' 123.txt
echo "awk '!/L/' 123.txt"
awk '!/L/' 123.txt
echo "awk '{print length}' 123.txt"#类似的不加参数都默认'$0'
awk '{print length}' 123.txt
echo "awk '{print length('$1')}' 123.txt"
awk '{print length($1)}' 123.txt
echo "awk 'NR==3{gsub(/B/,"C",'$0');print '$0'}' 123.txt"#注意字符要加""
awk 'NR==3{gsub(/B/,"C",$0);print $0}' 123.txt
echo "awk 'NR==3{gsub(/B/,1,'$0');print '$0'}' 123.txt"
awk 'NR==3{gsub(/B/,1,$0);print $0}' 123.txt
echo "awk 'NR==3{print substr('$0',1,3)}' 123.txt"#几个函数
awk 'NR==3{print substr($0,1,3)}' 123.txt
echo "awk 'NR==3{print match('$0',"D")}' 123.txt"
awk 'NR==3{print match($0,"D")}' 123.txt
echo "awk 'NR==3{print tolower('$0')}' 123.txt"
awk 'NR==3{print tolower($0)}' 123.txt
22 sed
sed的主要特点是可以编辑
基本语法
sed [选项] '[命令]' file
sed选项
-n : 安静模式, 一般sed用法中, 来自stdin的数据一般会被列出到屏幕上, 如果使用-n参数后, 只有经过sed处理的那一行被列出来.
-e : 多重编辑, 比如你同时又想删除某行, 又想改变其他行
-i : 直接编辑, 这回就是真的改变文件中的内容了, 别的都只是改变显示. (不推荐使用)
sed命令
p:打印行print
d:删除行delete
s:内容替换
c:行替换
a:当前行后添加一行
i:在当前行上面插入文本
实例
root@tom-virtual-machine:~/test# sed p 123.txt
1 2 3 4 5
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
y01 Y02 Y03 Y04 Z01
L D Q D S B
L D Q D S B
yi|ge|sha|zi
yi|ge|sha|zi
重复了
可以看出两点,1sed也是按行处理,2sed把行分为原有行和处理行,直接打印会都打印出来
root@tom-virtual-machine:~/test# sed -n p 123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
L D Q D S B
yi|ge|sha|zi
加上-n后只打印处理行
root@tom-virtual-machine:~/test# sed -n "1,2"p 123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
注意p这没有空格,""可以省略,后面类似的也都能略,但最好加上,后面就明白了
这里可以设置行号,正则表达式,数字n代表行号,$表示最后,()里有两个参是个范围,写一个参就是匹 配某行,这次没写到文件里,怎么用自己试去
root@tom-virtual-machine:~/test# sed -n "/D/"p 123.txt 正则表达式的,和awk一样
c 行替换
不多说了和p一样但不要-n
root@tom-virtual-machine:~/test# sed "1c hehe" 123.txt
hehe
y01 Y02 Y03 Y04 Z01
L D Q D S B
yi|ge|sha|zi
root@tom-virtual-machine:~/test# sed "/L/c hehe" 123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
hehe
yi|ge|sha|zi
i行插入
在第几行上面插,语法和p一样
root@tom-virtual-machine:~/test# sed "1i hehe" 123.txt
hehe
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
L D Q D S B
yi|ge|sha|zi
a i反过来就是
d 删除
最简单了上例子
root@tom-virtual-machine:~/test# sed "1d" 123.txt
y01 Y02 Y03 Y04 Z01
L D Q D S B
yi|ge|sha|z
可以看出行处理语法都差不多,内容处理的语法相对麻烦些
替换s 不会真正改变内容,不要-n
root@tom-virtual-machine:~/test# echo "i love you, you love me" | sed "s/love/like/"
i like you, you love me
root@tom-virtual-machine:~/test# echo "i love you, you love me" | sed "s/love/like/g"
i like you, you like me
加上g所有匹配到的都被替换,g可以改为n,代表替换第n个,ng代表替换第n-g个
对文件
root@tom-virtual-machine:~/test# sed s/D/d/2 123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
L D Q d S B
yi|ge|sha|zi
D这里是正则表达式
root@tom-virtual-machine:~/test# sed 1,3s/D/d/1 123.txt
1 2 3 4 5
y01 Y02 Y03 Y04 Z01
L d Q D S B
yi|ge|sha|zi
可以在前面控制行数,用法可p里的一样
root@tom-virtual-machine:~/test# sed "3s/D/d/1;2s/y/Y/1" 123.txt
1 2 3 4 5
Y01 Y02 Y03 Y04 Z01
L d Q D S B
yi|ge|sha|zi
可以设置多个条件用;隔开,多个必须带"",这里也能用-e来实现,具体自己试去
最后说下-i,不加只是闹着玩,加上就真的改变内容了,就这样
root@tom-virtual-machine:~/test# sed -i "1i hehe" 123.txt
23 trap
补一下脚本调试
debug模式
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
就会这一句
Linux中最常用的编辑器有vi(vim)和emacs
vi编辑有很多,常用的a,:q,:w,:wq
首先按esc后进入命令模式,
a 从光标处开始插入数据
x 删光标处
dd 删一行
yw 光标处拷贝
y$ 光标到行尾拷贝
yy 当前行拷贝
p 粘贴
:q 不保存退出
:w 保存
:wq 保存后退出
一些常用的密令:
查看cpu使用率:top
查看端口是否被占用 lsof -i:端口号
文件描述符
0:标准输入
1:标准输出
2:标准错误
查看安装的shell
cat /etc/shells
shell -version
$shell
$ echo $0
echo $PATH set看全部
查看PATH内容
黑洞
cat /dev/null>lala
使用free命令查看内存资源
使用du命令查看用户的工作目录占用了多少空间
使用df命令查看当前系统已安装的文件系统的空间使用情况
使用ps命令查看当前系统内的进程
netstat -an|grep 端口号
查看端口号是否开启
ps -ef|grep 端口号
lsof -i:端口号
查看端口号是否占用
if判断文件状态
-f 存在
-d 文件夹
-r 读
-w 写
-x 操作
if [ -e lala ];then echo $?;fi
创建用户时创建主目录
useradd -d /home/jc -m jc
删除用户时删除主目录
userdel -rf jc
进制转换,其他进制转十进制
((a=x16));echo $a