Data Wrangling
Та өгөгдлийг нэг форматаас өөр формат руу хөрвүүлэхийг хүсэж байсан уу? Мэдээж хэрэг хүсэж байсан байх! Ерөнхий утгаараа энэ хичээл үүний тухай бөгөөд текст эсвэл хоёртын форматтай өгөгдлийг яг өөрийн хүссэн хэлбэрт оруулах хүртэл боловсруулах тухай юм.
Бид өмнөх хичээлүүд дээр өгөгдөл цэгцлэх (data wrangling) анхан шатны үйлдлүүдийг
харсан. Ер нь | операторыг ашиглах болгонд ямар нэг хэмжээгээр өгөгдлийг
цэгцэлж байдаг. Жишээ нь, journalctl | grep -i intel командыг авч үзье. Энэ
нь системийн бүх лог дотроос Intel гэсэн үгийг агуулсан (том жижиг үсэг
харгалзахгүй) мөрүүдийг шүүж харуулдаг. Та үүнийг өгөгдөл цэгцлэх үйлдэл гэж
бодохгүй байж болох ч, нэг форматаас (системийн нийт лог) өөрт илүү хэрэгцээтэй
өөр формат руу (зөвхөн intel-тэй холбоотой лог) шилжүүлж байгаа хэрэг юм.
Өгөгдөл цэгцлэхэд хамгийн чухал нь ямар хэрэгслүүд байдгийг мэддэг, тэдгээрийг
хэрхэн хосуулж ашиглахаа ойлгодог байх явдал юм.
Эхнээс нь эхэлцгээе. Өгөгдөл цэгцлэхэд бидэнд хоёр зүйл хэрэгтэй: цэгцлэх өгөгдөл болон түүгээр хийх үйлдэл. Лог файлууд нь маш сайн жишээ болдог, учир нь тэднээс тодорхой мэдээлэл хайж олох шаардлага байнга гардаг бөгөөд бүгдийг нь нэг бүрчлэн унших боломжгүй байдаг. Миний сервер рүү хэн нэвтрэхийг оролдож байгааг серверийн лог файлуудаас харцгаая:
ssh myserver journalctl
Энэ нь хэтэрхий их мэдээлэл байна. Үүнийг зөвхөн ssh-тэй холбоотой мэдээллээр хязгаарлая:
ssh myserver journalctl | grep sshd
Бид өөрийн локал компьютер дээрх grep командаар дамжуулан алсын серверийн
файлыг урсгаж байгааг анхаараарай! ssh бол үнэхээр гайхалтай хэрэгсэл бөгөөд
бид дараагийн командын мөрийн орчны хичээл дээр энэ талаар илүү дэлгэрэнгүй
ярилцах болно. Гэхдээ энэ нь бидний хүссэнээс хамаагүй их мэдээлэл хэвээр байгаа
бөгөөд уншихад нэлээд төвөгтэй байна. Илүү сайжруулцгаая:
ssh myserver 'journalctl | grep sshd | grep "Disconnected from"' | less
Яагаад нэмэлт хашилтуудыг ашигласан бэ? Учир нь манай лог файлууд маш том байж
болох бөгөөд тэр бүх өгөгдлийг өөрийн компьютер руу урсгаж байж шүүх нь сүлжээний
зурвасын өргөн болон хугацааны хувьд үр ашиггүй юм. Үүний оронд алсын сервер
дээр шүүлт хийж, зөвхөн хэрэгцээт өгөгдлийг локал руу татаж боловсруулах нь зөв.
less нь урт гаралтыг дээш доош гүйлгэж унших боломжийг олгодог “хуудаслагч”
юм. Командын мөрөө туршиж, хөгжүүлж байх явцдаа сүлжээний ачааллыг хэмнэхийн
тулд шүүсэн лог файлаа локал файлдаа хадгалж аваад ажиллаж болно:
$ ssh myserver 'journalctl | grep sshd | grep "Disconnected from"' > ssh.log
$ less ssh.log
Энд одоо ч хэрэггүй олон мэдээлэл байсаар байна. Үүнийг арилгах маш олон арга
бий, гэхдээ таны багаж хэрэгслийн хайрцаг дахь хамгийн хүчирхэг хэрэгслүүдийн
нэг болох sed-тэй танилцацгаая.
sed бол хуучны ed засварлагч дээр суурилсан “урсгал засварлагч” (stream
editor) юм. Үүн дээр та файлын агуулгыг шууд өөрчлөхөөс илүүтэйгээр түүнийг
хэрхэн өөрчлөх талаар богино командуудыг өгдөг. Маш олон тушаал байдгаас хамгийн
түгээмэл ашиглагддаг нь s буюу орлуулах (substitution) тушаал юм. Жишээлбэл,
бид ингэж бичиж болно:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed 's/.*Disconnected from //'
Бидний сая бичсэн зүйл бол энгийн тогтмол илэрхийлэл (regular expression)
юм. Энэ нь бичвэрийг тодорхой хэв загвартай тааруулах боломж олгодог хүчирхэг
бүтэц юм. s тушаал нь s/REGEX/SUBSTITUTION/ хэлбэрээр бичигддэг бөгөөд энд
REGEX нь таны хайхыг хүссэн тогтмол илэрхийлэл, харин SUBSTITUTION нь
олдсон текстийг орлуулах шинэ бичвэр юм.
(Та энэ бичлэгийг манай Vim хичээлийн тэмдэглэлийн
“Хайх ба орлуулах” хэсгээс таньж магадгүй юм! Vim нь sed-ийн орлуулах
тушаалтай төстэй хайж орлуулах синтаксыг ашигладаг. Нэг хэрэгслийг сурах нь
ихэвчлэн бусад хэрэгслүүдийг илүү сайн эзэмшихэд тусалдаг.)
Тогтмол илэрхийллүүд
Тогтмол илэрхийллүүд (regular expressions) нь маш түгээмэл бөгөөд хэрэгцээтэй
тул тэдгээр нь хэрхэн ажилладгийг ойлгоход цаг гаргах нь зүйтэй. Дээр ашигласан
/.*Disconnected from / илэрхийллээс эхэлцгээе. Тогтмол илэрхийллүүд нь
ихэвчлэн (үргэлж биш ч гэсэн) / тэмдэгтээр хүрээлэгдсэн байдаг. Ихэнх ASCII
тэмдэгтүүд нь зөвхөн өөрийн үндсэн утгыг илэрхийлдэг боловч зарим тэмдэгтүүд нь
тусгай үүрэгтэй байдаг. Тогтмол илэрхийллийн янз бүрийн хэрэгжүүлэлтүүдээс
шалтгаалж ямар тэмдэгт ямар үүрэгтэй болох нь бага зэрэг ялгаатай байдаг нь
хөгжүүлэгчдийн толгойг нэлээд өвтгөдөг. Түгээмэл хэрэглэгддэг загварууд:
.шинэ мөрөөс бусад “ямар ч нэг тэмдэгт”-ийг илэрхийлнэ.*өмнөх тэмдэгт нь тэг буюу түүнээс олон удаа давтагдахыг заана.+өмнөх тэмдэгт нь нэг буюу түүнээс олон удаа давтагдахыг заана.[abc]a,b,cтэмдэгтүүдийн аль нэгийг заана.(RX1|RX2)RX1эсвэлRX2илэрхийллийн аль нэгтэй таарахыг заана.^мөрийн эхлэлийг заана.$мөрийн төгсгөлийг заана.
sed-ийн тогтмол илэрхийлэл нь арай өвөрмөц бөгөөд дээрх тусгай тэмдэгтүүдийг
ажиллуулахын тулд өмнө нь \ нэмж өгөх шаардлагатай байдаг. Эсвэл үүний оронд
-E тугийг дамжуулж болно.
Тиймээс, /.*Disconnected from / илэрхийллийг эргэн харвал энэ нь ямар ч
тооны тэмдэгтээр эхэлж, араас нь “Disconnected from “ гэсэн үг залгагдсан ямар
ч бичвэртэй таарна. Энэ нь бидний хүссэн зүйл мөн боловч тогтмол илэрхийлэл нь
маш зальжин гэдгийг анхаараарай. Хэрэв хэн нэгэн хэрэглэгчийн нэрээ
“Disconnected from” гэж тохируулаад нэвтрэхийг оролдвол яах вэ? Лог дараах
байдалтай харагдана:
Jan 17 03:13:00 thesquareplanet.com sshd[2631]: Disconnected from invalid user Disconnected from 46.97.239.16 port 55920 [preauth]
Бидэнд ямар үр дүн үлдэх вэ? Ер нь * болон + тэмдэгтүүд нь анхдагч
тохиргоогоороо “шунахай” (greedy) байдаг. Тэд боломжит хамгийн урт бичвэртэй
таарахыг хичээдэг. Тиймээс дээрх тохиолдолд бид дараах үр дүнтэй үлдэнэ:
46.97.239.16 port 55920 [preauth]
Энэ нь бидний хүссэн үр дүн биш байж магадгүй. Тогтмол илэрхийллийн зарим
хэрэгжүүлэлтэд * эсвэл + тэмдэгтийн ард ? нэмж өгснөөр тэднийг
“шунахай бус” болгодог боловч харамсалтай нь sed үүнийг дэмждэггүй. Гэхдээ бид
үүнийг дэмждэг perl-ийн командын мөрийн горим руу шилжиж болно:
perl -pe 's/.*?Disconnected from //'
Бид цаашдаа sed-ийг үргэлжлүүлэн ашиглах болно, учир нь энэ нь ийм төрлийн
ажилд хамгийн түгээмэл хэрэглэгддэг хэрэгсэл юм. sed нь мөн заасан тэмдэгттэй
таарсан мөрүүдийг хэвлэх, нэг удаагийн дуудалтаар олон орлуулалт хийх, хайлт хийх
гэх мэт бусад олон зүйлийг хийх чадвартай. Гэхдээ бид энд тэдгээрийг хэт
нарийвчлан үзэхгүй. sed нь өөрөө бие даасан маш том сэдэв боловч ихэнхдээ
үүнээс илүү сайн өөр хэрэгслүүд байдаг.
Одоо бидэнд хэрэглэгчийн нэрний ард байгаа дагаврыг арилгах шаардлага гарлаа. Үүнийг хэрхэн хийх вэ? Хэрэглэгчийн нэрний дараа орох текстийг яг таг тааруулах нь нэлээд төвөгтэй, ялангуяа хэрэглэгчийн нэр нь сул зай агуулсан байж болох тохиолдолд! Бидний хийх ёстой зүйл бол бүх мөрийг тааруулах явдал юм:
| sed -E 's/.*Disconnected from (invalid |authenticating )?user .* [^ ]+ port [0-9]+( \[preauth\])?$//'
Regex дебаггер ашиглан энд юу болж байгааг
харцгаая. Эхлэл хэсэг нь өмнөхтэй адил байна. Дараа нь бид “user” гэсэн үгний
хувилбаруудыг (лог дотор хоёр төрлийн угтвар байдаг) тааруулж байна. Дараа нь
хэрэглэгчийн нэр байгаа хэсгийн ямар ч тэмдэгттэй тааруулж байна. Тэгээд дурын
нэг үгтэй ([^ ]+; сул зайгүй, хоосон биш дурын тэмдэгтүүд) тааруулж байна.
Дараа нь “port” гэсэн үг болон түүний ард орох тоон цуваатай тааруулна. Тэгээд
боломжит [preauth] дагавар болон мөрийн төгсгөлтэй тааруулж байна.
Энэ аргыг ашигласнаар “Disconnected from” гэсэн хэрэглэгчийн нэр биднийг төөрөгдүүлэхгүй болно. Яагаад гэдгийг та мэдэж байна уу?
Гэхдээ үүнд нэг асуудал байгаа нь лог хуудас бүхэлдээ хоосон болж байна. Бид
хэрэглэгчийн нэрийг авч үлдэхийг хүсэж байгаа шүү дээ. Үүний тулд бид “илрүүлж
барих бүлгүүд” (capture groups) ашиглаж болно. Хаалтанд авсан тогтмол
илэрхийлэлтэй таарч буй дурын бичвэр нь дугаарлагдсан барих бүлэгт хадгалагддаг.
Эдгээрийг орлуулах хэсэгт (зарим системд загвар дотор нь ч ашиглаж болно) \1,
\2, \3 гэх мэтээр дуудаж ашиглаж болно. Ингээд:
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/'
Таны төсөөлж байгаачлан маш нарийн төвөгтэй тогтмол илэрхийллүүдийг бичиж болно. Жишээлбэл, и-мэйл хаягийг хэрхэн тааруулах тухай нийтлэл байдаг. Энэ нь тийм ч амар биш. Мөн үүний эргэн тойронд маш их хэлэлцүүлэг байдаг. Хүмүүс үүнд зориулж тестүүд болон тестийн матрицуудыг хүртэл бичсэн байдаг. Та бүр өгөгдсөн тоог анхны тоо мөн эсэхийг шалгах тогтмол илэрхийллийг ч бичиж болно.
Тогтмол илэрхийллийг яг зөв бичих нь хэцүү байдаг ч тэдгээр нь таны багаж хэрэгслийн хайрцагт байх ёстой туйлын хэрэгцээтэй зүйлс юм!
Өгөгдөл цэгцлэх ажилдаа эргэн орцгооё
Одоо бидэнд ийм команд байна:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/'
sed нь текст оруулах (i тушаал), мөрүүдийг ил тод хэвлэх (p тушаал),
индексээр мөр сонгох зэрэг олон төрлийн үйлдлийг хийж чаддаг. Илүүг man sed
хуудаснаас үзээрэй!
Ямартай ч одоо бидэнд нэвтрэхийг оролдсон бүх хэрэглэгчийн нэрсийн жагсаалт байна. Гэхдээ энэ нь тийм ч ашигтай биш юм. Хамгийн түгээмэл нэрсийг олцгооё:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' \
| sort | uniq -c
sort нь мэдээж оролтыг эрэмбэлнэ. uniq -c нь дараалсан ижил мөрүүдийг нэг мөр
болгон нэгтгэж, өмнө нь давтагдсан тоог нь харуулдаг. Бид үүнийг дахин
эгнүүлж, зөвхөн хамгийн түгээмэл 10 хэрэглэгчийн нэрийг авч үлдэхийг хүсэж
болох юм:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' \
| sort | uniq -c \
| sort -nk1,1 | tail -n10
sort -n нь текстийн бус тоон утгаар нь эрэмбэлнэ. -k1,1 нь “зөвхөн сул
зайгаар тусгаарлагдсан эхний баганаар эрэмбэлэх”-ийг заана. ,1 хэсэг нь эхний
талбараар эрэмбэлээд дуусгахыг хэлж байгаа бөгөөд анхдагчаар мөрийн төгсгөл хүртэл
эрэмбэлдэг. Энэ тодорхой жишээн дээр бүтэн мөрөөр эрэмбэлсэн ч ялгаагүй боловч
бид сурч байгаа тул үүнийг мэдэж байх нь зүйтэй!
Хэрэв бид хамгийн цөөн давтагдсаныг нь авахыг хүсвэл tail-ийн оронд head
ашиглаж болно. Мөн урвуу дарааллаар эрэмбэлдэг sort -r сонголт бий.
Ингэж харах нь зүгээр боловч хэрэв бид эдгээр хэрэглэгчийн нэрсийг тохиргооны файлд ашиглахын тулд мөр бүрт биш, харим таслалаар тусгаарласан жагсаалт болгон авахыг хүсвэл яах вэ?
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' \
| sort | uniq -c \
| sort -nk1,1 | tail -n10 \
| awk '{print $2}' | paste -sd,
Хэрэв та macOS ашиглаж байгаа бол: дээрх команд нь macOS-ийн дагалдах BSD-ийн
paste програм дээр ажиллахгүй байж магадгүй. BSD болон GNU-ийн coreutils
хэрэгслүүдийн ялгаа болон macOS дээр GNU coreutils-ийг хэрхэн суулгах талаар
shell хэрэгслүүдийн хичээлийн 4-р дасгалаас харна
уу.
Эхлээд paste тушаалыг авч үзье: энэ нь мөрүүдийг (-s) заасан нэг тэмдэгт
тусгаарлагчаар (-d; энэ тохиолдолд ,) холбох боломжийг олгодог. Гэхдээ
awk гэж юу вэ?
awk – өөр нэгэн засварлагч
awk бол текст урсгалыг боловсруулахад маш сайн зохицсон програмчлалын хэл
юм. awk-ийг бүрэн сурахын тулд маш их зүйл ярих шаардлагатай боловч бид
бусад сэдвүүдийн адил зөвхөн анхан шатны мэдлэгийг авч үзэх болно.
Эхлээд {print $2} юу хийдэг вэ? awk програмууд нь сонголттой загвар болон
тухайн загвар нь мөртэй таарсан тохиолдолд хийх үйлдлийг заасан блок кодоос
бүрддэг. Анхдагч загвар (бидний дээр ашигласан) нь бүх мөртэй таардаг. Блок
дотор $0 нь тухайн мөрийг бүхэлд нь илэрхийлэх бөгөөд $1-ээс $n хүртэлх
хувьсагчид нь awk-ийн талбар тусгаарлагчаар (field separator - анхдагчаар
сул зай бөгөөд үүнийг -F тугаар өөрчилж болно) хуваагдсан мөрийн n дэх
талбаруудыг заана. Энэ тохиолдолд бид мөр бүрийн хоёр дахь талбар буюу
хэрэглэгчийн нэрийг хэвлэж байна!
Арай илүү нарийн зүйл хийж үзцгээе. c үсгээр эхэлж, e үсгээр төгссөн,
зөвхөн нэг удаа нэвтрэхийг оролдсон хэрэглэгчдийн тоог олцгооё:
| awk '$1 == 1 && $2 ~ /^c[^ ]*e$/ { print $2 }' | wc -l
Энд задлан шинжлэх зүйл нэлээд байна. Эхлээд бидэнд загвар ({...} хаалтны
өмнөх хэсэг) байна. Энэ загвар нь мөрийн эхний талбар 1-тэй тэнцүү байх (энэ нь
uniq -c тушаалын тоолуур) бөгөөд хоёр дахь талбар нь өгөгдсөн тогтмол
илэрхийлэлтэй таарч байхыг шаардаж байна. Блок хэсэг нь зөвхөн хэрэглэгчийн
нэрийг хэвлэнэ. Дараа нь бид гаралтын мөрийн тоог wc -l ашиглан тоолж байна.
Гэхдээ awk бол програмчлалын хэл гэдгийг санаж байгаа биз дээ?
BEGIN { rows = 0 }
$1 == 1 && $2 ~ /^c[^ ]*e$/ { rows += $1 }
END { print rows }
BEGIN загвар нь оролтын эхэнд ажиллах кодыг тодорхойлно (харин END нь
төгсгөлд ажиллана). Одоо мөр бүрийн хувьд ажиллах блок нь эхний талбарын утгыг
(энэ тохиолдолд үргэлж 1 байх боловч) нэмж, төгсгөлд нь нийлбэрийг хэвлэж байна.
Үнэндээ бид awk ашиглан grep болон sed-ийг бүрэн
орлуулах
боломжтой боловч үүнийг уншигч танд дасгал болгон үлдээе.
Өгөгдлийг шинжлэх
Та командын мөрөөс STDIN-ээс уншдаг тооны машин болох bc командыг ашиглан
шууд тооцоолол хийж болно! Жишээлбэл, мөр бүр дээрх тоонуудыг хооронд нь +
тэмдэгтээр холбоод нэмж болно:
| paste -sd+ | bc -l
Эсвэл илүү нарийн илэрхийлэл үүсгэж болно:
echo "2*($(data | paste -sd+))" | bc -l
Та өгөгдлийн статистикийг янз бүрийн аргаар авах боломжтой.
st нь маш хэрэгтэй хэрэгсэл боловч хэрэв
таны системд R хэл суулгагдсан бол:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' \
| sort | uniq -c \
| awk '{print $1}' | R --no-echo -e 'x <- scan(file="stdin", quiet=TRUE); summary(x)'
R нь өгөгдлийн шинжилгээ болон зураглал хийхэд
зориулагдсан өөр нэгэн (жаахан өвөрмөц) програмчлалын хэл юм. Бид дэлгэрэнгүй
ярихгүй ч, summary тушаал нь өгөгдсөн векторын статистик хураангуйг хэвлэдэг
бөгөөд бид оролтын урсгалаар вектор үүсгэж өгсөн тул R бидэнд хэрэгтэй
статистикийг гаргаж өгч байна!
Хэрэв танд энгийн график зурах шаардлагатай бол gnuplot туслах болно:
ssh myserver journalctl \
| grep sshd \
| grep "Disconnected from" \
| sed -E 's/.*Disconnected from (invalid |authenticating )?user (.*) [^ ]+ port [0-9]+( \[preauth\])?$/\2/' \
| sort | uniq -c \
| sort -nk1,1 | tail -n10 \
| gnuplot -p -e 'set boxwidth 0.5; plot "-" using 1:xtic(2) with boxes'
Өгөгдөл цэгцлэх замаар аргумент үүсгэх
Заримдаа та тодорхой жагсаалтаас шүүлт хийж, олдсон зүйлсийг устгах эсвэл
суулгахын тулд өгөгдөл цэгцлэх хэрэгтэй болдог. Бидний ярилцсан өгөгдөл цэгцлэх
аргуудыг xargs-тай хослуулснаар маш хүчирхэг шийдэл болдог.
Жишээлбэл, хичээл дээр үзсэнчлэн миний систем дээрх Rust-ийн хуучин nightly
хувилбаруудыг олоод, тэдгээрийн нэрийг өгөгдөл цэгцлэх багажаар шүүж авч, дараа
нь устгах програм руу xargs-аар дамжуулан устгаж болно:
rustup toolchain list | grep nightly | grep -vE "nightly-x86" | sed 's/-x86.*//' | xargs rustup toolchain uninstall
Хоёртын өгөгдлийг цэгцлэх
Бид одоог хүртэл голдуу текст өгөгдлийг цэгцлэх талаар ярилцсан боловч суваг нь хоёртын өгөгдөлд ч мөн адил ашигтай байдаг. Жишээлбэл, бид ffmpeg ашиглан камераасаа зураг авч, түүнийг саарал өнгөтэй болгон хувиргаж, шахаад, SSH-ээр алсын компьютер руу илгээж, тэндээ буцааж задлаад, хуулбар хийн хэвлэж харуулах боломжтой.
ffmpeg -loglevel panic -i /dev/video0 -frames 1 -f image2 - \
| convert - -colorspace gray - \
| gzip \
| ssh mymachine 'gzip -d | tee copy.jpg | env DISPLAY=:0 feh -'
Дасгалууд
- Энэхүү богино хэмжээний тогтмол илэрхийллийн хичээлийг хийж үзээрэй.
/usr/share/dict/wordsдотроос дор хаяж гурванaүсэг агуулсан бөгөөд's-ээр төгсөөгүй үгсийн тоог олоорой. Эдгээр үгсийн хамгийн түгээмэл төгсгөлийн хоёр үсэг нь юу вэ?sed-ийнyтушаал эсвэлtrпрограм нь том жижиг үсгийн зөрүүг арилгахад тусалж чадна. Эдгээр хоёр үсгийн хослол нийт хэдэн ширхэг байна вэ? Мөн сорилт болгон: ямар хослолууд огт байхгүй байна вэ?- Файл доторх утгыг шууд өөрчлөхийн тулд `sed s/REGEX/SUBSTITUTION/ input.txt
input.txt
гэж бичих нь элбэг байдаг. Гэхдээ энэ нь яагаад буруу санаа вэ? Энэ нь зөвхөнsedтушаалд хамаатай юу? Үүнийг хэрхэн зөв хийхийгman sed` хуудаснаас олж мэдээрэй. - Сүүлийн арван ачаалал дээрх системийн дундаж, медиан болон хамгийн их
ачаалсан хугацааг олоорой. Linux дээр
journalctl, macOS дээрlog showашиглаж, ачаалж эхлэх болон дуусах үеийн лог хугацааг хараарай. Linux дээр тэдгээр нь ингэж харагдаж болно:Logs begin at ...болон
systemd[577]: Startup finished in ...macOS дээр ингэж харагдаж болно:
=== system boot:болон
Previous shutdown cause: 5 - Өмнөх сүүлийн гурван ачаалал хоорондоо ижил биш байгаа ачааллын
мэдээллүүдийг олж хараарай (
journalctl-ийн-bтугийг харна уу). Энэ даалгаврыг хэд хэдэн алхамд хуваана уу. Эхлээд сүүлийн гурван ачааллын логийг олох аргыг олоорой. Таны ашиглаж буй хэрэгсэлд үүнд тохирох туг байж болно, эсвэлsed '0,/STRING/d'ашигланSTRING-тэй таарахаас өмнөх бүх мөрийг устгаж болно. Дараа нь мөр болгонд байнга өөрчлөгддөг хэсгүүдийг (жишээ нь цагийн тэмдэг) устгаарай. Тэгээд оролтын мөрүүдийг давхардалгүй болгож, давталтын тоог олоорой (uniqашиглаарай). Эцэст нь давталтын тоо нь 3 байгаа мөрүүдийг (бүх ачаалал дээр ижил байсан тул) хасаарай. - Энэ
эсвэл энэ
мэт, эсвэл
эндээс
олсон онлайн өгөгдлийн багцыг аваарай. Үүнийг
curlашиглан татаж аваад зөвхөн тоон мэдээлэл бүхий хоёр баганыг шүүж аваарай. Хэрэв та HTML өгөгдөл татаж байгаа болpupхэрэгтэй байж магадгүй. JSON өгөгдөл болjq-г ашиглаарай. Нэг баганын хамгийн бага болон хамгийн их утгыг нэг тушаалаар олж, харин өөр нэг тушаалаар хоёр багана бүрийн нийлбэрийн зөрүүг олоорой.
Лиценз: CC BY-NC-SA.