常用Linux及awk命令学习

Linux命令

快捷键

Ctrl+L 清屏
Ctrl+K 从光标位置删除到末尾
Ctrl+U 从光标位置删除到开头

文件权限

一共10位,第一位表示文件类型,其他9位3个一组,顺序是rwx(读、写、可执行)
每组分别代表owner的权限、与当前用户同组的用户权限、其他用户权限

文件类型有几种标识
d:目录
-:文件
l:链接

修改文件、目录权限的命令

chmod u=rwx,g=rw,o=r aaa.txt

u是属主,g是当前用户所在组同组的用户,o是其他用户

还可以用数字表示

chmod 764 aaa.txt

修改文件所属用户和所属组

chown username:groupName aa.txt
chown username:aa.txt
chown:groupName aa.txt

-R:递归子目录修改所属者和所属组

cd

进入目录
用法:绝对路径、相对路径

cd /root/Documents
cd ./path # 进入同级的path目录
cd ../path # 进入上一级的path目录
cd - # 进入上一级目录

ls

list
加参数展示内容不同
-a # 列出全部文件,包括隐藏文件
-l # 列出文件属性和权限
-R # 连子文件夹里的内容也一起列出
-h # 文件大小展示更友好

ls -l相当于ll

grep

抓取包含某内容的一行
通常与管道命令一起使用

grep [-acinv][--color=auto]'字符串'filename

-a # binary文件以text文件的方式查找
-c # 计算查找到的次数
-i # 忽略大小写
-v # 反向选择

man

man [命令]
列出命令的使用方法

wc

wordcount
返回结果里有4个值,分别表示行数、单词数、字符数、文件名

参数
-l:查看行数
-w:查看单词数
-c:查看字符数

du

查看文件大小
-h:人性化显示单位(文件大小以k为单位)
-s:不递归,只统计该文件目录的大小

mkdir、rmdir

创建、删除文件夹

mkdir -p test/a/b  # 在test下的a下创建文件夹b。创建文件夹时,如果上面的文件夹都不存在,就创建一个
rmdir test  # 删除test目录。test目录必须是空目录

touch、rm

rm test.txt  # 带询问的删除
rm -f test.txt  # 不询问直接删除
rm -r test  # 递归删除,即删除目录以及其目录下的子目录(带询问的删除)
rm -rf test  # 直接删除test目录及其子目录

-f:force,强制删除
-i:互动模式
-r:递归删除

打包解包

tar -zcvf [打包压缩后的文件名.tar.gz] [要打包压缩的文件]

-z:调用gzip压缩命令进行压缩
-c:打包文件
-v:显示运行过程
-f:指定文件名

解压也是tar
参数
-x:解压
-C:指定解压的位置

tar -xvf xxx.tar.gz -C /usr
tar -xvf xxx.tar.gz

cp

cp [-adfilprsu] 来源文件 目标文件

-a相当于-pdr
-p:复制文件的属性(备份常用)
-d:若来源是link file,就复制link file属性而非文件本身
-r:递归复制,一般用在目录复制时

-i:如果目标档已存在,覆盖前询问

mv

-f:force,强制删除
-i:互动模式
-u:如果目标文件已存在,且source比较新,就会升级(update)

更名

mv mvtest mvtest2

文件查看

cat # 从第一行显示文件内容
tac # 从最后一行倒着显示文件
nl # 输出内容带行号
more # 一页一页输出
less # 和more类似,但可以往前翻页
tail
head

tail -n100  # -n后面接数字表示显示几行
tail -f

awk

以文件的一行内容为处理对象,根据指定的条件判断是否处理此行内容。若符合条件,按照动作处理文本

语法

处理文件内容

awk 'condition{action}' filename

处理其他命令执行结果

command | awk 'condition{action}'

常用参数

$1表示打印echo的结果里的第一个空格分隔出来的单词。
从1开始数,不从0开始
$0表示当前整行内容

[User1@vultr ~]$ echo "aa bb cc dd   ee   ff" | awk '{print $1}'
aa
[User1@vultr ~]$ echo "aa bb cc dd   ee   ff" | awk '{print $4}'
dd
[User1@vultr ~]$ echo "aa bb cc dd   ee   ff" | awk '{print $5}'
ee

-F这个参数可以指定分隔符

[User1@vultr ~]$ echo "aa bb cc 1 dd   ee   ff" | awk -F '1' '{print $1}'
aa bb cc
[User1@vultr ~]$ echo "aa bb: cc dd   ee   ff" | awk -F ':' '{print $1}'
aa bb

NF表示当前行字段个数 所以第NF个字段表示最后一个字段,$(NF-1)表示倒数第二个字段

[User1@vultr ~]$ echo "aa bb: cc dd   ee   ff" | awk -F ':' '{print $NF}'
 cc dd   ee   ff
[User1@vultr ~]$ echo "aa bb: cc dd   ee   ff" | awk -F ':' '{print $(NF-1)}'
aa bb

NR表示行号
逗号分隔变量,会以空格分隔输出
注意右括号,必须用双引号括起来,才能正常输出

[User1@vultr ~]$ cat testfile
test file ouput
line2
line3
[User1@vultr ~]$ cat testfile | awk '{print NR")",$0}'
1) test file ouput
2) line2
3) line3

FILENAME表示当前文件名
只有awk+filename这种形式才能打印出文件名

[User1@vultr ~]$ awk '{print FILENAME,NR")",$0}' testfile
testfile 1) test file ouput
testfile 2) line2
testfile 3) line3

使用管道形式打印时,文件名会输出为”-“

[User1@vultr ~]$ cat testfile | awk '{print FILENAME, NR")",$0}'
- 1) test file ouput
- 2) line2
- 3) line3

RS表示行分隔符,默认是换行符

[User1@vultr ~]$ cat testfile | awk '{print $0,RS}'
test file ouput

line2

line3

OFS表示用空格分隔内容

ORS表示用换行符分隔内容

[User1@vultr ~]$ echo "aa1bb1cc1dd" | awk -F "1" '{print $1 ORS}'
aa

tolower()

toupper()

[User1@vultr ~]$ echo "aa1bb1cc1dd" | awk -F "1" '{print toupper($1)}'
AA

length()
substr($1,2) # 分割字符,$1表示第一个单词,2表示从这个单词的第二个字符开始到结尾
substr($1,2,1) # 分割字符,$1表示第一个单词,2和1表示从第二个字符开始,往后取1个字符

[User1@vultr ~]$ echo "abcd1efgh1ijkl1mnop" | awk -F "1" '{print substr($1,2)}'
bcd
[User1@vultr ~]$ echo "abcd1efgh1ijkl1mnop" | awk -F "1" '{print substr($1,2,1)}'
b

rand()表示随机数

printf

printf跟C语言的差不多,可以格式化字符

匹配字符串内容

打印包含某字符串的行
特殊的字符需要转义(比如要找/,需要在前面打一个)

[User1@vultr ~]$ cat testfile
test file ouput
line2
line3
[User1@vultr ~]$ cat testfile | awk '/line/ {print $0}'
line2
line3

某个字段完全匹配某个值

[User1@vultr ~]$ echo "abcd1efgh1ijkl1mnop" | awk -F "1" '$1=="abcd" {print $0}'
abcd1efgh1ijkl1mnop

布尔值

[User1@vultr ~]$ cat testfile | awk 'NR==2 {print $0}'
line2
[User1@vultr ~]$ cat testfile | awk 'NR>1 {print $0}'
line2
line3
[User1@vultr ~]$ cat testfile | awk 'NR%2==1 {print $0}'
test file ouput
line3

if...else...

if和else语句用;分隔
if条件用括号括起来

[User1@vultr ~]$ echo "abcd1efgh1ijkl1mnop" | awk -F "1" '{if ($1=="abcd") print "1";else print "0"}'
1

BEGIN和END

表示程序执行前/执行后,需要执行的一段代码

[User1@vultr ~]$ awk 'BEGIN {print "start!"}
> {print $0}
> END {print "EOF"}' testfile
start!
test file ouput
line2
line3
EOF
原文地址:https://www.cnblogs.com/wuhuohanke/p/11920985.html