Программисты должны знать команду awk в Linux.

Linux

предисловие

Для профессионального программиста необходимо освоить знания, связанные с Linux.Среди них обработка текста является нашей обычной операцией, такой как форматирование и вывод нужных нам данных, которые могут поступать из текстовых файлов или каналов символов, или подсчет частоты и общее количество данных, которые нам нужны в тексте. Тогда на этот разawkЭто стоит нашего изучения.

текст

В Linux awk, sed и grep называются «Три мушкетера», и все они связаны с манипулированием текстом Каковы их соответствующие характеристики?

grep: подходит для простого поиска и сопоставления.
sed: подходит для изменения совпадающего текста.
awk: подходит для сложного форматирования текста.

Итак, awk - это инструментальный язык программирования для обработки текста. Он сканирует каждую строку входных данных. Если он соответствует текущему шаблону, он выполнит соответствующее действие. Если он не соответствует или действие текущей строки было выполнено, он переходит к следующему шагу Строка обрабатывается до тех пор, пока чтение данных не будет завершено.

Основное использование

базовый синтаксис awk
awk [option] 'pattern{action}' files

//awk 关键字
//[option] 可以省略的一些参数
//'pattern{action}' pattern 是匹配的条件,可省略。action是具体执行的动作。
//files 是我们操作的文件,可多文件操作。
Типичное использование awk
awk '{
    BEGIN{action ...} //执行前语句
    {action...} //匹配处理每行数据
    END{action...} //执行后语句
}'
встроенные переменные awk
Переменная эффект
FS войтиполеРазделитель, пробел по умолчанию
OFS выходполеРазделитель, пробел по умолчанию
RS входная записьДанные рядаразделитель, новая строка по умолчанию
ORS Выходная запись такжеДанные рядаразделитель, новая строка по умолчанию
NF Количество полей, на которые разбита текущая строка
NR Текущий номер строки, начиная с 1, значение также будет накапливаться в нескольких файлах
FNR Текущий номер строки, начиная с 1, отличается от NR, он накапливается в соответствии с соответствующим файлом
FILENAME текущее имя файла
$0 Текущие данные строки
$1 ~ $n Получить N-е поле записи строки

Пример:

[root@wangzh awkdemo]# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...
//利用FS修改输入字段分割符,然后输出行号以及第1第7个字段的值
[root@wangzh awkdemo]# awk 'BEGIN{FS=":"} {print NR,$1,$7}'  /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
3 daemon /sbin/nologin
4 adm /sbin/nologin
...
//跟上一个例子的区别,添加了标题的输出,修改了输出字段的分隔符为"-"
[root@wangzh awkdemo]#awk 'BEGIN{FS=":";print "Result Title"} {print NR,$1}' OFS="-"  /etc/passwd
Result Title
1-root
2-bin
3-daemon
4-adm
...
Операторы и регуляры

Этот контент похож на большинство наших языков программирования, вы можете сравнить его по горизонтали, и вы можете немного понять его для новых студентов.

Арифметические операторы:==,>,<,!=,>=,<=,+,-

Логические операторы:&&,||

Обычный:

  • /regex/ Содержимое строки соответствует обычному и выполняет действие
  • !/regex/ выполнить действие, если содержимое строки не соответствует обычному
  • $1 ~ /regex/ соответствует регулярному выражению только в первом поле
  • $1 !~ /regex/ Первое поле не соответствует регулярному выражению

Случай:

//'-F:' 是定义输入字段分割字符的另一种方法,这个匹配第一个字段包含'root'的信息 
[root@wangzh awkdemo]# awk -F: '$1 ~ /root/ {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
dockerroot:x:994:991:Docker User:/var/lib/docker:/sbin/nologin
//输出第一行到第三行的数据
[root@wangzh awkdemo]# ip addr | awk 'NR>=1 && NR<=3 {print}'
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
if/for/while
if(condi1){action1} else if(condi2){action2} else{action3}

---

for(i=1;i<=NR;i++){
    action1;
    action2;
    ...
}

---

while(condi){
    action1;
    ...
}

Как видите, использование почти такое же, как и у многих языков программирования.Ниже приведен простой пример.

[root@wangzh awkdemo]# cat t1.log 
1 aa
3 bb
10 cc
9 dd
5 ee

---

//判断每行第一个字段是否是3-9之间的数字,然后输出对应的结果
[root@wangzh awkdemo]# awk '{if($1 ~ /[3-9]/){print "yes"} else {print "no"}}' t1.log 
no
yes
no
yes
yes
встроенная функция

В awk есть много встроенных функций, которые помогают нам инкапсулировать некоторые операции с символами, математические операции и т. д. Для конкретного использования вам необходимо обратиться к справочному руководству.Давайте сначала представим использование более часто используемой подпрограммы () функция.

Ссылаться на:Блог Woohoo.cn на.com/filmformation/arc…

sub( Ere, Repl, [ string ] )

Строковый параметр — это обрабатываемая строка, значение по умолчанию —$0То есть текущая строка
ПучокEreИспользуются регулярно совпадающие строкиReplстрока для замены

[root@wangzh awkdemo]# awk 'BEGIN{info="this is a test2019test!";sub(/[0-9]+/,"!",info);print info}'   
this is a test!test!

Практический случай

Подсчет вхождений ключевых слов в текст

[root@wangzh awkdemo]# cat data.txt 
ID NAME
1 xiaom
2 zsan
3 lisi
4 lisi
5 lisi
6 xiaom
7 lisi
8 xiaom
9 xiaoh
10 zsan

---

[root@wangzh awkdemo]# awk 'BEGIN{print "Statistics Result >>>>>"} {if(FNR>1){result[$2]+=1}} END{for(i in result){print i,"count:"result[i]} {print "over >>>>"}}' data.txt 
Statistics Result >>>>>
xiaoh count:1
xiaom count:3
zsan count:2
lisi count:4
over >>>>

Эпилог

Цель этой статьи — дать учащимся, которые не ознакомились с этим содержимым, перцептивное понимание обработки текста. Освоение awk — это определенно не то, чему можно научиться, просто глядя на него. Вы должны практиковать его самостоятельно. Если у вас возникнут проблемы, прочтите руководство. Скоро вы станете мастером обработки текста.


Сообщение в блоге публичного аккаунта синхронизировано с репозиторием Github. Заинтересованные друзья могут помочь дать звезду. Кодировать слова непросто. Спасибо за вашу поддержку.

GitHub.com/PE PPA немного…

Рекомендуемое чтение

"Правильное использование позы для журналов Java
"Является ли использование ConcurrentHashMap определенным потокобезопасным?
"Народный язык понимает, что такое синхронный/асинхронный/блокирующий/неблокирующий
"О нескольких позах и способах самоспасения при взрыве JVM

Если у тебя что-то получится, поставь лайк

Обратите внимание на «Программу обезьяны посреди ночи» и поделитесь лучшими галантерейными товарами