完成编辑并保存退出后,临时交换文件会被删除;但如果 Vim 意外退出,那么这个临时文件就会留在硬盘中。当 Vim 再次启动时,会检查当前目录中是否存在交换文件。如果存在,则意味着 Vim 正在编辑此文件(他人正在编辑),或者在上次编辑过程中意外退出,这时Vim就会给出警告信息,并要求我们在以下四个选项中做出选择:
Open Read-Only(以只读方式打开):如果我们想要查看文件内容或是有另一个编辑过程正在运行,那么可以选择此选项;
$?可以获取到执行./test.sh a b c命令后的返回值。在执行一个前台命令后,可以立即用 $?获取到该命令的返回值。该命令可以是系统自身的命令,可以是shell脚本,也可以是自定义的 bash 函数
输入与输出 I/O
#!/bin/bash
read -p "please enter your name:" NAME #-p 指定读取时的提字符
echo "your name is $NAME"
逻辑与判断
数值与逻辑判断语法
var1 -eq var2 # true if var1 is equal to var2
var1 -ne var2 # true if var1 not equal to var2
var1 -lt var2 # true if var1 is less than var2
var1 -le var2 # true if var1 is less than or equal to var2
var1 -gt var2 # true if var1 greater than var2
var1 -ge var2 # true if var1 greater than or equal to var2
string1 != string2 # true if string1 not equal to straing2
-d FILE # True if FILE is a directory
-e FILE # True if FILE exists
-f FILE # True if FILE exists and is a regular file
-r FILE # True if FILE is readable
-s FILE # True if FILE exists and is not empty
-w FILE # True if FILE has write permission
-x FILE # True if FILE is executable
if 语句
if [condition-is-true]
then
command 1
command 2
...
fi
#if-else
if [condition-is-true]
then
command 1
elif [condition-is-true]
then
command 2
fi
迭代与循环
#for 循环
for VARIABLE in ITEM
do
command 1
command 2
...
done
E.g.
#!/bin/bash
COLORS="red green blue"
for COLOR in $COLORS
do
echo "the color is: $COLOR"
done
#while 循环
while [ COMMAND IS TRUE ]
do
command 1
done
错误用法 [0 -eq 1] ;正确用法 [ 0 -eq 1 ]
命令的传递
符号
作用
|
管道符:将前一个命令的输出作为第二个命令的参数。
||
逻辑或:前一个命令执行错误后第二个命令才会执行,否则第一个命令不执行。
&&
逻辑与:当前一个命令正确执行后才会执行第二个命令。
;
多命令顺序执行,命令之间无任何逻辑关系。
不是所有的命令都支持管道符,如ls类命令 (但可以配合xargs的命令使用)
E.g. 将cat的输出结果作为grep的参数,只打印出包含“alias”的行
[zhangzh@node01 ~]$ cat .bashrc
# .bashrc
#alias
alias cl='clear'
[zhangzh@node01 ~]$ cat .bashrc | grep alias
#alias
alias cl='clear'
E.g. 若 lab1 不存在,则创建 lab1
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
[zhangzh@node01 ~]$ ls lab1 || touch lab1
ls: cannot access 'lab1': No such file or directory
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj 0 May 8 16:29 lab1
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
E.g. 若存在 lab1 ,则删除 lab1
[zhangzh@node01 ~]$ ll
total 4
-rw-r--r-- 1 zhangzh ybj 0 May 8 16:29 lab1
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
[zhangzh@node01 ~]$ ls lab1 && rm lab1
lab1
[zhangzh@node01 ~]$ ll
total 4
drwx------ 2 zhangzh ybj 4096 May 8 16:17 linux
E.g. 使用分号将编译命令和运行命令连接在一起,以便在编译成功后立即运行程序
gcc -o myprogram myprogram.c ; ./myprogram
Linux 文本三剑客
重定向符号
输入重定向符号
符号
作用
命令 < 文件
将文件作为命令的标准输入
命令 << 分界符
从标准输入中读入,直到遇到分界符停止
命令 < 文件1 >文件2
将文件1作为命令的标准输入并将标准输出到文件2
输出重定向符号
符号
作用
命令 > 文件
将标准输出重定向到文件中(清除原有文件中的数据)
命令 2> 文件
将错误输出重定向到文件中(清除原有文件中的数据)
命令 >> 文件
将标准输出重定向到文件中(在原有的内容后追加)
命令 2>> 文件
将错误输出重定向到文件中(在原有内容后面追加)
命令 >> 文件 2>&1
或
命令 &>> 文件
将标准输出和错误输出共同写入文件(在原有内容后追加)
MacBook-Pro:code zhangzh$ ls -l xx
ls: xx: No such file or directory
MacBook-Pro:code zhangzh$ cat 1.txt
cat: 1.txt: No such file or directory
MacBook-Pro:code zhangzh$ vi 1.txt
MacBook-Pro:code zhangzh$ cat 1.txt
MacBook-Pro:code zhangzh$ ls -l xx > 1.txt
ls: xx: No such file or directory
MacBook-Pro:code zhangzh$ cat 1.txt
MacBook-Pro:code zhangzh$ ls -l xx 2> 1.txt
MacBook-Pro:code zhangzh$ cat 1.txt
ls: xx: No such file or directory
MacBook-Pro:code zhangzh$
awk 命令
数据可以来自标准输入,一个或多个文件。支持正则表达
格式:
awk [options] 'script' var filename(s)
实例:
[zhangzh@node01 shell]$ cat student.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
脚本通常由''或""包含
[zhangzh@node01 shell]$ awk '$0 ~ /LuoHu/' student.dat # ~ !~ 匹配与不匹配正则运算符
Mary 116018 LuoHu W 65
[zhangzh@node01 shell]$ awk '/LuoHu/' student.dat
Mary 116018 LuoHu W 65
[zhangzh@node01 shell]$ awk '$0 !~ /LuoHu/' student.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Steven 116030 YanTian M 78
语句块通常由{}包含
[zhangzh@node01 shell]$ awk '{if ($5>80) print $1}' student.dat
Tom
John
有无空格不影响脚本执行,但如果需要打印空格,可以使用" "包裹起来
[zhangzh@node01 shell]$ awk '{if($5>80)print$1}' student.dat
Tom
John
指定某一位的字符,真则打印
[zhangzh@node01 shell]$ awk '/n/' student.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ awk '/^.....n/' student.dat
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ awk '$0 !~ /^.....n/' student.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
NR 表示记录数,执行过程中对应行号
[zhangzh@node01 shell]$ awk 'NR%2==1' student.dat #打印奇数行
Tom 116001 FuTian M 90
Mary 116018 LuoHu W 65
sed [options] 'commands' filename(s)
sed [options] -f scriptfile filename(s)
指定显示
[zhangzh@node01 shell]$ cat test.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed -n '2,3p' test.dat # -n:仅显示处理后的结果
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
[zhangzh@node01 shell]$ sed -n '/11/I p' test.dat # I:按包含字符打印(忽略大小写)
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed -n '/^Mary/p' test.dat # ^:打印以Mary开头的行
Mary 116018 LuoHu W 65
[zhangzh@node01 shell]$ sed -n '/00/I p' test.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
替换删除
[zhangzh@node01 shell]$ sed 's/11/22/g' test.dat # s:替换指定字符;g:全文逐行替换
Tom 226001 FuTian M 90
John 226005 NanShan M 85
Mary 226018 LuoHu W 65
Steven 226030 YanTian M 78
[zhangzh@node01 shell]$ sed '4c\Key' test.dat # c\:将选定行修改为新文本
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Key
[zhangzh@node01 shell]$ sed '1d' test.dat
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed '1,3d' test.dat # d:删除选中行
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ cat test.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed -i '1,3d' test.dat # -i:直接编辑文件(不可撤回)
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ cat test.dat
Steven 116030 YanTian M 78
指定插入
[zhangzh@node01 shell]$ sed '4a\Key' test.dat # a\:在第4行后添加文本
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
Key
[zhangzh@node01 shell]$ sed '4i\Key' test.dat # i\:在第4行前添加文本
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Key
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed -e 4i\Key test.dat # -e:以脚本运行
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Key
Steven 116030 YanTian M 78
匹配标记
[zhangzh@node01 shell]$ sed 's/\w\+/[&]/g' test.dat
[Steven] [116030] [YanTian] [M] [78]
[zhangzh@node01 shell]$ sed 's/^Steven/&s/g' test.dat
Stevens 116030 YanTian M 78
[zhangzh@node01 shell]$ sed 's/YanTian/&s/g' test.dat
Steven 116030 YanTians M 78
组合表达
[zhangzh@node01 shell]$ echo hello world | sed 's/hello/hellow/g' | sed 's/world/word/'
hellow word
[zhangzh@node01 shell]$ echo hello world | sed 's/hello/hellow/g ; s/world/word/'
hellow word
正则表达
[zhangzh@node01 shell]$ cat test.dat
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
[zhangzh@node01 shell]$ sed '/^$/d' test.dat #删除空白行
Tom 116001 FuTian M 90
John 116005 NanShan M 85
Mary 116018 LuoHu W 65
Steven 116030 YanTian M 78
引用
如果表达式内包含字符串变量,则需要用双引号
[zhangzh@node01 shell]$ test=hello
[zhangzh@node01 shell]$ echo hello WORLD | sed "s/$test/HELLO/"
HELLO WORLD
grep 命令
可以抓取你想要的字符,grep 命令可以抓取字符所在行的文本。常用的参数有:
-i忽略大小写进行匹配;
-v反向查找,只打印不匹配的行;
-r递归查找。可以同时打印文件名和所在行内容,这在使用通配符查找时很有用。
[zhangzh@node01 ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ];
then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
#ROOT environment
source /home/software/cern_root/root_install/bin/thisroot.sh
#alias
alias cl='clear'
[zhangzh@node01 ~]$ cat .bashrc | grep alias
#alias
alias cl='clear'