PCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2NvbW1vbn0tLT4JPCEtLXtpZiAkX0dFVFsnbW9kJ10gPT0gJ3ZpZXd0aHJlYWQnICYmICFlbXB0eSgkX0dbJ3RpZCddKX0tLT4KCTxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5xaWRhbzEyMy5jb20vYmJzL3RocmVhZC17JF9HWyd0aWQnXX0tMS0xLmh0bWwiIC8+Cgk8IS0te2Vsc2VpZiAkX0dFVFsnbW9kJ10gPT0gJ2ZvcnVtZGlzcGxheScgJiYgIWVtcHR5KCRfR1snZmlkJ10pfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZm9ydW0teyRfR1snZmlkJ119LTEuaHRtbCIgLz4KCTwhLS17ZWxzZWlmICRfR0VUWydtb2QnXSA9PSAnZ3VpZGUnfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZ3VpZGUvIiAvPgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2ZvcnVtJyAmJiAoZW1wdHkoJF9HRVRbJ21vZCddKSB8fCAkX0dFVFsnbW9kJ10gPT0gJ2luZGV4Jyl9LS0+Cgk8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0iaHR0cHM6Ly93d3cucWlkYW8xMjMuY29tL2Jicy8iIC8+Cgk8IS0tey9pZn0tLT4KCXJgbmB0PG1ldGEgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIgY29udGVudD0iJF9HWydzZXR0aW5nJ11bJ2JibmFtZSddIiAvPgoJPG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi10b29sdGlwIiBjb250ZW50PSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydwb3J0YWxzdGF0dXMnXX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsxXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ3BvcnRhbCddKSA/ICRfR1snc2NoZW1lJ10uJzovLycuJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsncG9ydGFsJ10gOiAkX0dbc2l0ZXVybF0uJ3BvcnRhbC5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L3BvcnRhbC5pY28iIC8+PCEtLXsvaWZ9LS0+Cgk8bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsyXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2ZvcnVtJ10pID8gJF9HWydzY2hlbWUnXS4nOi8vJy4kX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydmb3J1bSddIDogJF9HW3NpdGV1cmxdLidmb3J1bS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2Jicy5pY28iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydncm91cHN0YXR1cyddfS0tPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tdGFzayIgY29udGVudD0ibmFtZT0kX0dbJ3NldHRpbmcnXVsnbmF2cyddWzNdWyduYXZuYW1lJ107YWN0aW9uLXVyaT17ZWNobyAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsnZ3JvdXAnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2dyb3VwJ10gOiAkX0dbc2l0ZXVybF0uJ2dyb3VwLnBocCd9O2ljb24tdXJpPXskX0dbc2l0ZXVybF19e0lNR0RJUn0vZ3JvdXAuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiBoZWxwZXJfYWNjZXNzOjpjaGVja19tb2R1bGUoJ2ZlZWQnKX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVs0XVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSA6ICRfR1tzaXRldXJsXS4naG9tZS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2hvbWUuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PSAnZm9ydW0nICYmICRfR1snc2V0dGluZyddWydhcmNoaXZlciddfS0tPgoJCTxsaW5rIHJlbD0iYXJjaGl2ZXMiIHRpdGxlPSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIGhyZWY9InskX0dbc2l0ZXVybF19YXJjaGl2ZXIvIiAvPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICFlbXB0eSgkcnNzaGVhZCl9LS0+JHJzc2hlYWQ8IS0tey9pZn0tLT4KCTwhLS17aWYgd2lkdGhhdXRvKCl9LS0+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBpZD0iY3NzX3dpZHRoYXV0byIgdHlwZT0idGV4dC9jc3MiIGhyZWY9J3skX0dbJ3NldHRpbmcnXVsnY3NzcGF0aCddfXtTVFlMRUlEfV93aWR0aGF1dG8uY3NzP3tWRVJIQVNIfScgLz4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+SFRNTE5PREUuY2xhc3NOYW1lICs9ICcgd2lkdGhhdXRvJzwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddID09ICdmb3J1bScgfHwgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2dyb3VwJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19Zm9ydW0uanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17ZWxzZWlmICRfR1snYmFzZXNjcmlwdCddID09ICdob21lJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19aG9tZS5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ3BvcnRhbCd9LS0+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRfR1tzZXR0aW5nXVtqc3BhdGhdfXBvcnRhbC5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddICE9ICdwb3J0YWwnICYmICRfR0VUWydkaXknXSA9PSAneWVzJyAmJiBjaGVja19kaXlfcGVybSgkdG9waWMpfS0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskX0dbc2V0dGluZ11banNwYXRoXX1wb3J0YWwuanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBpZD0iZGl5X2NvbW1vbiIgaHJlZj0ieyRfR1snc2V0dGluZyddWydjc3NwYXRoJ119e1NUWUxFSUR9X2Nzc19kaXkuY3NzP3tWRVJIQVNIfSIgLz4KCTwhLS17L2lmfS0tPgo8L2hlYWQ+Cgo8Ym9keSBpZD0ibnZfeyRfR1tiYXNlc2NyaXB0XX0iIGNsYXNzPSJwZ197Q1VSTU9EVUxFfXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PT0gJ3BvcnRhbCcgJiYgQ1VSTU9EVUxFID09PSAnbGlzdCcgJiYgIWVtcHR5KCRjYXQpfSB7JGNhdFsnYm9keWNzcyddfXsvaWZ9IiBvbmtleWRvd249ImlmKGV2ZW50LmtleUNvZGU9PTI3KSByZXR1cm4gZmFsc2U7Ij4KCTxkaXYgaWQ9ImFwcGVuZF9wYXJlbnQiPjwvZGl2PjxkaXYgaWQ9ImFqYXh3YWl0aWQiPjwvZGl2PgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8IS0te3RlbXBsYXRlIGNvbW1vbi9oZWFkZXJfZGl5fS0tPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJPCEtLXt0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2RpeW5hdn0tLT4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiBDVVJNT0RVTEUgPT0gJ3RvcGljJyAmJiAkdG9waWMgJiYgZW1wdHkoJHRvcGljWyd1c2VoZWFkZXInXSkgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQkkZGl5bmF2Cgk8IS0tey9pZn0tLT4KCTwhLS17aWYgZW1wdHkoJHRvcGljKSB8fCAkdG9waWNbJ3VzZWhlYWRlciddfS0tPgoJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ21vYmlsZSddWydhbGxvd21vYmlsZSddICYmICghJF9HWydzZXR0aW5nJ11bJ2NhY2hlaW5kZXhsaWZlJ10gJiYgISRfR1snc2V0dGluZyddWydjYWNoZXRocmVhZG9uJ10gfHwgJF9HWyd1aWQnXSkgJiYgKCRfR0VUWydkaXknXSAhPSAneWVzJyB8fCAhJF9HRVRbJ2luYWpheCddKSAmJiAoJF9HWydtb2JpbGUnXSAhPSAnJyAmJiAkX0dbJ2Nvb2tpZSddWydtb2JpbGUnXSA9PSAnJyAmJiAkX0dFVFsnbW9iaWxlJ10gIT0gJ25vJyl9LS0+CgkJCTxkaXYgY2xhc3M9InhpMSBibSBibV9jIj4KCQkJICAgIHtsYW5nIHlvdXJfbW9iaWxlX2Jyb3dzZXJ9PGEgaHJlZj0ieyRfR1snc2l0ZXVybCddfWZvcnVtLnBocD9tb2JpbGU9eWVzIj57bGFuZyBnb190b19tb2JpbGV9PC9hPiA8c3BhbiBjbGFzcz0ieGcxIj58PC9zcGFuPiA8YSBocmVmPSIkX0dbJ3NldHRpbmcnXVsnbW9iaWxlJ11bJ25vbW9iaWxldXJsJ10iPntsYW5nIHRvX2JlX2NvbnRpbnVlfTwvYT4KCQkJPC9kaXY+CgkJPCEtLXsvaWZ9LS0+CgkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J10pICYmICRfR1snbWVtYmVyJ11bY3JlZGl0c10gPj0gJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J119LS0+CgkJCTxkaXYgaWQ9InNob3J0Y3V0Ij4KCQkJCTxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0Y2xvc2VpZCIgdGl0bGU9IntsYW5nIGNsb3NlfSI+e2xhbmcgY2xvc2V9PC9hPjwvc3Bhbj4KCQkJCXtsYW5nIHNob3J0Y3V0X25vdGljZX0KCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0dGlwIj57bGFuZyBzaG9ydGN1dF9hZGR9PC9hPgoKCQkJPC9kaXY+CgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zZXRUaW1lb3V0KHNldFNob3J0Y3V0LCAyMDAwKTs8L3NjcmlwdD4KCQk8IS0tey9pZn0tLT4KCQk8ZGl2IGlkPSJ0b3B0YiIgY2xhc3M9ImNsIj4KCQkJPCEtLXtob29rL2dsb2JhbF9jcG5hdl90b3B9LS0+CgkJCTxkaXYgY2xhc3M9IndwIj4KCQkJCTxkaXYgY2xhc3M9InoiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsndG9wbmF2cyddWzBdICRuYXZ9LS0+CgkJCQkJCTwhLS17aWYgaXNfYXJyYXkoJG5hdikgJiYgJG5hdlsnYXZhaWxhYmxlJ10gJiYgKCEkbmF2WydsZXZlbCddIHx8ICgkbmF2WydsZXZlbCddID09IDEgJiYgJF9HWyd1aWQnXSkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMiAmJiAkX0dbJ2FkbWluaWQnXSA+IDApIHx8ICgkbmF2WydsZXZlbCddID09IDMgJiYgJF9HWydhZG1pbmlkJ10gPT0gMSkpfS0tPiRuYXZbY29kZV08IS0tey9pZn0tLT4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfY3BuYXZfZXh0cmExfS0tPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJ5Ij4KCQkJCQk8YSBpZD0ic3dpdGNoYmxpbmQiIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0idG9nZ2xlQmxpbmQodGhpcykiIHRpdGxlPSJ7bGFuZyBzd2l0Y2hfYmxpbmR9IiBjbGFzcz0ic3dpdGNoYmxpbmQiPjwvYT4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX2NwbmF2X2V4dHJhMn0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ3RvcG5hdnMnXVsxXSAkbmF2fS0tPgoJCQkJCQk8IS0te2lmIGlzX2FycmF5KCRuYXYpICYmICRuYXZbJ2F2YWlsYWJsZSddICYmICghJG5hdlsnbGV2ZWwnXSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAxICYmICRfR1sndWlkJ10pIHx8ICgkbmF2WydsZXZlbCddID09IDIgJiYgJF9HWydhZG1pbmlkJ10gPiAwKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAzICYmICRfR1snYWRtaW5pZCddID09IDEpKX0tLT4kbmF2W2NvZGVdPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8IS0te2lmIGVtcHR5KCRfR1snZGlzYWJsZWR3aWR0aGF1dG8nXSkgJiYgJF9HWydzZXR0aW5nJ11bJ3N3aXRjaHdpZHRoYXV0byddfS0tPgoJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJzd2l0Y2h3aWR0aCIgb25jbGljaz0id2lkdGhhdXRvKHRoaXMpIiB0aXRsZT0ie2lmIHdpZHRoYXV0bygpfXtsYW5nIHN3aXRjaF9uYXJyb3d9e2Vsc2V9e2xhbmcgc3dpdGNoX3dpZGV9ey9pZn0iIGNsYXNzPSJzd2l0Y2h3aWR0aCI+PCEtLXtpZiB3aWR0aGF1dG8oKX0tLT57bGFuZyBzd2l0Y2hfbmFycm93fTwhLS17ZWxzZX0tLT57bGFuZyBzd2l0Y2hfd2lkZX08IS0tey9pZn0tLT48L2E+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3VpZCddICYmICFlbXB0eSgkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10pfS0tPjxhIGlkPSJzc2xjdCIgaHJlZj0iamF2YXNjcmlwdDo7IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uKCkge3Nob3dNZW51KHsnY3RybGlkJzonc3NsY3QnLCdwb3MnOiczNCEnfSl9KTsiPntsYW5nIGNoYW5nZXN0eWxlfTwvYT48IS0tey9pZn0tLT4KCQkJCQk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJCQkJCSRkaXluYXYKCQkJCQk8IS0tey9pZn0tLT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPCEtLXtpZiAhSVNfUk9CT1R9LS0+CgkJCTwhLS17aWYgJF9HWyd1aWQnXSAmJiAhJF9HWydzZXR0aW5nJ11bJ2JiY2xvc2VkJ10gJiYgZW1wdHkoJF9HWydtZW1iZXInXVsnZnJlZXplJ10pICYmICRfR1snbWVtYmVyJ11bJ2dyb3VwaWQnXSAhPSA1fS0tPgoJCQk8dWwgaWQ9Im15cHJvbXB0X21lbnUiIGNsYXNzPSJwX3BvcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89cG0iIGlkPSJwbV9udGMiIHN0eWxlPSJiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjxlbSBjbGFzcz0icHJvbXB0X25ld3N7aWYgZW1wdHkoJF9HW21lbWJlcl1bbmV3cG1dKX1fMHsvaWZ9Ij48L2VtPntsYW5nIHBtX2NlbnRlcn08L2E+PC9saT4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZvbGxvd3N0YXR1cyddfS0tPgoJCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9Zm9sbG93JmRvPWZvbGxvd2VyIj48ZW0gY2xhc3M9InByb21wdF9mb2xsb3dlcntpZiBlbXB0eSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pfV8wey9pZn0iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3dlcn0tLT57aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93ZXJdfSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pey9pZn08L2E+PC9saT4KCQkJCQk8IS0te2lmICRfR1ttZW1iZXJdW25ld3Byb21wdF0gJiYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93XX0tLT4KCQkJCQkJPGxpPjxhIGhyZWY9ImhvbWUucGhwP21vZD1mb2xsb3ciPjxlbSBjbGFzcz0icHJvbXB0X2NvbmNlcm4iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3d9LS0+KCRfR1ttZW1iZXJdW25ld3Byb21wdF9udW1dW2ZvbGxvd10pPC9hPjwvbGk+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0XX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydtZW1iZXInXVsnY2F0ZWdvcnlfbnVtJ10gJGtleSAkdmFsfS0tPgoJCQkJCQk8bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPW5vdGljZSZ2aWV3PSRrZXkiPjxlbSBjbGFzcz0ibm90aWNlXyRrZXkiPjwvZW0+PCEtLXtlY2hvIGxhbmcoJ3RlbXBsYXRlJywgJ25vdGljZV8nLiRrZXkpfS0tPig8c3BhbiBjbGFzcz0icnEiPiR2YWw8L3NwYW4+KTwvYT48L2xpPgoJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgZW1wdHkoJF9HWydjb29raWUnXVsnaWdub3JlX25vdGljZSddKX0tLT4KCQkJCQk8bGkgY2xhc3M9Imlnbm9yZV9ub3RpY2VsaSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBvbmNsaWNrPSJzZXRjb29raWUoJ2lnbm9yZV9ub3RpY2UnLCAxKTtoaWRlTWVudSgnbXlwcm9tcHRfbWVudScpIiB0aXRsZT0ie2xhbmcgdGVtcG9yYXJpbHlfdG9fcmVtaW5kfSI+PGVtIGNsYXNzPSJpZ25vcmVfbm90aWNlIj48L2VtPjwvYT48L2xpPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCTwvdWw+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ10gJiYgIWVtcHR5KCRfR1snc3R5bGUnXVsnZXh0c3R5bGUnXSl9LS0+CgkJCQk8ZGl2IGlkPSJzc2xjdF9tZW51IiBjbGFzcz0iY2wgcF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAhJF9HW3N0eWxlXVtkZWZhdWx0ZXh0c3R5bGVdfS0tPjxzcGFuIGNsYXNzPSJzc2xjdF9idG4iIG9uY2xpY2s9ImV4dHN0eWxlKCcnKSIgdGl0bGU9IntsYW5nIGRlZmF1bHR9Ij48aT48L2k+PC9zcGFuPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10gJGV4dHN0eWxlfS0tPgoJCQkJCQk8c3BhbiBjbGFzcz0ic3NsY3RfYnRuIiBvbmNsaWNrPSJleHRzdHlsZSgnJGV4dHN0eWxlWzBdJykiIHRpdGxlPSIkZXh0c3R5bGVbMV0iPjxpIHN0eWxlPSdiYWNrZ3JvdW5kOiRleHRzdHlsZVsyXSc+PC9pPjwvc3Bhbj4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJPC9kaXY+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ119LS0+CgkJCQk8dWwgaWQ9Im15aXRlbV9tZW51IiBjbGFzcz0icF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZm9ydW1zdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPXRocmVhZCZ2aWV3PW1lIj57bGFuZyBteXBvc3R9PC9hPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZmF2b3JpdGVzdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPWZhdm9yaXRlJnZpZXc9bWUiPntsYW5nIGZhdm9yaXRlfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZyaWVuZHN0YXR1cyddfS0tPjxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89ZnJpZW5kIj57bGFuZyBmcmllbmRzfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfbXlpdGVtX2V4dHJhfS0tPgoJCQkJPC91bD4KCQkJPCEtLXsvaWZ9LS0+CgkJCTwhLS17c3VidGVtcGxhdGUgY29tbW9uL2hlYWRlcl9xbWVudX0tLT4KCQk8IS0tey9pZn0tLT4KCgkJPCEtLXthZC9oZWFkZXJiYW5uZXIvd3AgYV9ofS0tPgoJCTxkaXYgaWQ9ImhkIj4KCQkJPGRpdiBjbGFzcz0id3AiPgoJCQkJPGRpdiBjbGFzcz0iaGRjIGNsIj4KCQkJCQk8IS0te2V2YWwgJG1uaWQgPSBnZXRjdXJyZW50bmF2KCk7fS0tPgoJCQkJCTxoMj48IS0te2lmICFpc3NldCgkX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF0pfS0tPjxhIGhyZWY9IntpZiAkX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydkZWZhdWx0J119eyRfR1snc2NoZW1lJ119Oi8veyRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2RlZmF1bHQnXX0ve2Vsc2V9Li97L2lmfSIgdGl0bGU9IiRfR1snc2V0dGluZyddWydiYm5hbWUnXSI+eyRfR1snc3R5bGUnXVsnYm9hcmRsb2dvJ119PC9hPjwhLS17ZWxzZX0tLT4kX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF08IS0tey9pZn0tLT48L2gyPgoJCQkJCTwhLS17dGVtcGxhdGUgY29tbW9uL2hlYWRlcl91c2Vyc3RhdHVzfS0tPgoJCQkJPC9kaXY+CgoJCQkJPGRpdiBpZD0ibnYiPgoJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InFtZW51IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uICgpIHtzaG93TWVudSh7J2N0cmxpZCc6J3FtZW51JywncG9zJzonMzQhJywnY3RybGNsYXNzJzonYScsJ2R1cmF0aW9uJzoyfSk7c2hvd0ZvcnVtbWVudSgkX0dbZmlkXSk7fSkiPntsYW5nIG15X25hdn08L2E+CgkJCQkJPHVsPgoJCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ25hdnMnXSAkbmF2fS0tPgoJCQkJCQkJPCEtLXtpZiBpc19hcnJheSgkbmF2KSAmJiAkbmF2WydhdmFpbGFibGUnXSAmJiAoISRuYXZbJ2xldmVsJ10gfHwgKCRuYXZbJ2xldmVsJ10gPT0gMSAmJiAkX0dbJ3VpZCddKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAyICYmICRfR1snYWRtaW5pZCddID4gMCkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMyAmJiAkX0dbJ2FkbWluaWQnXSA9PSAxKSl9LS0+PGxpIHtpZiAkbW5pZCA9PSAkbmF2W25hdmlkXSB8fCBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sIDEpID09IHN0cl9yZXBsYWNlKCcuLycsICcnLCAkbmF2W2ZpbGVuYW1lXSl9Y2xhc3M9ImEiIHsvaWZ9JG5hdltuYXZdPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQkJPC91bD4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX25hdl9leHRyYX0tLT4KCQkJCTwvZGl2PgoJCQkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3BsdWdpbnMnXVsnanNtZW51J10pfS0tPgoJCQkJCTx1bCBjbGFzcz0icF9wb3AgaF9wb3AiIGlkPSJwbHVnaW5fbWVudSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsncGx1Z2lucyddWydqc21lbnUnXSAkbW9kdWxlfS0tPgoJCQkJCQkgPCEtLXtpZiBpbl9hcnJheSgkbW9kdWxlWydhZG1pbmlkJ10sIGFycmF5KDAsIC0xKSkgfHwgKCRtb2R1bGVbJ2FkbWluaWQnXSAmJiAkX0dbJ2FkbWluaWQnXSA+IDAgJiYgJG1vZHVsZVsnYWRtaW5pZCddID49ICRfR1snYWRtaW5pZCddKX0tLT4KCQkJCQkJIDxsaT4kbW9kdWxlW3VybF08L2xpPgoJCQkJCQkgPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8L3VsPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCQkkX0dbc2V0dGluZ11bbWVudW5hdnNdCgkJCQk8ZGl2IGlkPSJtdSIgY2xhc3M9ImNsIj4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ3N1Ym5hdnMnXX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HW3NldHRpbmddW3N1Ym5hdnNdICRuYXZpZCAkc3VibmF2fS0tPgoJCQkJCQk8IS0te2lmICRfR1snc2V0dGluZyddWyduYXZzdWJob3ZlciddIHx8ICRtbmlkID09ICRuYXZpZH0tLT4KCQkJCQkJPHVsIGNsYXNzPSJjbCB7aWYgJG1uaWQgPT0gJG5hdmlkfWN1cnJlbnR7L2lmfSIgaWQ9InNuYXZfJG5hdmlkIntpZiAkbW5pZCAhPSAkbmF2aWR9IHN0eWxlPSJkaXNwbGF5Om5vbmUiey9pZn0+CgkJCQkJCSRzdWJuYXYKCQkJCQkJPC91bD4KCQkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCTwhLS17L2lmfS0tPgoJCQkJPC9kaXY+CgkJCQk8IS0te2FkL3N1Ym5hdmJhbm5lci9hX211fS0tPgoJCQkJPCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vcHVic2VhcmNoZm9ybX0tLT4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTwhLS17aG9vay9nbG9iYWxfaGVhZGVyfS0tPgoJPCEtLXsvaWZ9LS0+CgoJPGRpdiBpZD0id3AiIGNsYXNzPSJ3cCI+Cg==
qidao123.com ToB IT社区-企服评测·应用市场»论坛 › 主机系统 › linux › Linux系统中的管道下令、grep下令、sed下令和awk下令 ...
返回列表 发新帖

Linux系统中的管道下令、grep下令、sed下令和awk下令

[复制链接]
发表于 2024-8-12 23:44:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本章将和大家分享Linux系统中的管道下令、grep下令、sed下令和awk下令。废话不多说,下面我们直接进入主题。
一、管道下令

Linux 中的管道下令(pipe)是一种非常强盛的特性,它答应你将一个下令的输出作为另一个下令的输入。管道下令极大地增强了下令行的灵活性和功能,使得复杂的数据处置处罚任务变得简单。
1、根本语法
  1. command1 | command2
复制代码
command1 的输出会被传递给 command2 作为其输入。
可以链式使用多个管道下令,例如 command1 | command2 | command3。
2、示例

1)检察系统进程并按内存使用量排序
  1. ps aux --sort=-%mem | less
复制代码
这里,ps aux --sort=-%mem 下令列出所有进程并按内存使用率降序排序,然后通过管道传递给 less 下令,使得你可以逐页检察输出。
2)查找包罗特定文本的文件,并计算行数
  1. grep '特定文本' 文件名 | wc -l
复制代码
这里,grep '特定文本' 文件名 下令查找文件中包罗“特定文本”的行,然后将这些行传递给 wc -l 下令来计算行数。
3)检察当前目录的文件和目录,然后仅显示目录
  1. ls -l | grep '^d'
复制代码
ls -l 下令以长格式列出当前目录的内容,然后通过管道传递给 grep '^d' 下令,后者仅匹配以 d(体现目录)开头的行。
4)使用多个管道举行复杂的数据处置处罚
假设你有一个日志日志文件,你想要找出所有错误消息(假设以 "ERROR" 开头),并计算这些消息的数量,同时忽略大小写:
  1. grep -i 'error' 日志日志文件.log | wc -l
复制代码
这里,grep -i 'error' 日志日志文件.log 下令使用 -i 选项忽略大小写地查找包罗 "error" 的行,然后通过管道传递给 wc -l 下令来计数。
3、注意事项


  • 管道下令中的每个下令都在其子 shell 中运行,因此它们之间的变量不是共享的。
  • 管道下令中每个下令的输入和输出都是通过标准输入(stdin)和标准输出(stdout)举行的,除非特殊重定向了输入或输出。
  • 管道下令中的错误输出(stderr)默认不会传递给下一个下令,除非使用重定向或特殊的下令(如 2>&1)来合并标准输出和错误输出。
二、grep下令

重要作用是文件过滤分割与合并,grep(global search regular expression(RE) and print out the line,全面搜刮正则表达式并把行打印出来)是一种强盛的文本搜刮工具,它能使用正则表达式搜刮文本,并把匹配的行打印出来。
1、根本语法
  1. grep [选项]... 模式 [文件]...
复制代码

  • 选项:可以调整 grep 的行为,如忽略大小写、显示匹配行的行号等。
  • 模式:指定要搜刮的文本模式,可以是简单的字符串或复杂的正则表达式。
  • 文件:指定要搜刮的文件名。如果没有指定文件名,grep 将从标准输入读取数据。
2、常用选项


  • -i:忽略大小写。
  • -v:反向选择,只显示不匹配的行。
  • -c:计算匹配的行数,而不是显示行内容。
  • -l:只列出包罗匹配文本的文件名,而不显示匹配的行。
  • -n:显示匹配的行号。
  • -r 或 -R:递归搜刮子目录中的文件。
  • -E:使用扩展的正则表达式。
  • -F:将模式作为固定字符串处置处罚,而不是正则表达式。
  • -o:只输出匹配的部分,而不是整行。
  • -A 数字:显示匹配行以及之后的几行。
  • -B 数字:显示匹配行以及之前的几行。
  • -C 数字:显示匹配行以及上下文的几行。
3、示例

1)根本语法
  1. grep pattern file.txt
复制代码
2)忽略大小写
  1. grep -i pattern file.txt
复制代码
3)显示行号
  1. grep -n pattern file.txt
复制代码
4)递归搜刮所有子目录
  1. grep -rnw '/path/to/directory' -e 'pattern'
复制代码
5)只显示文件名
  1. grep -l pattern *.txt
复制代码
6)只显示匹配的行数
  1. grep -c pattern file.txt
复制代码
7)匹配整个单词
  1. grep -w pattern file.txt
复制代码
8)使用正则表达式
  1. grep -E '\bword\b' file.txt
复制代码
9)显示上下文的几行
  1. grep -C 2 pattern file.txt
复制代码
10)搜刮文件中的所有“error”字符串
  1. grep "error" /var/log/syslog
复制代码
11)搜刮当前目录及子目录下所有文件中包罗“function”的行,并显示行号
  1. grep -rn "function" .
复制代码
12)计算文件中包罗“warning”的行数
  1. grep -c "warning" file.txt
复制代码
13)反向选择,显示不包罗“debug”的所有行
  1. grep -v "debug" file.txt
复制代码
14)在多个文件中查找
  1. grep "match_pattern" file_1 file_2 file_3 ...
复制代码
15)标志匹配颜色 --color=auto 选项
  1. grep "match_pattern" file_name --color=auto
复制代码
16)使用正则表达式 -E 选项
  1. grep -E "[1-9]+"
  2. 或
  3. egrep "[1-9]+"
复制代码
17)只输出文件中匹配到的部分 -o 选项
  1. [root@localhost ~]# echo this is a test line. | grep -o -E "[a-z]+\."
  2. line.
  3. [root@localhost ~]# echo this is a test line. | egrep -o "[a-z]+\."
  4. line.
复制代码
18)统计文件或者文本中包罗匹配字符串的行数 -c 选项
  1. grep -c "text" file_name
复制代码
19)输出包罗匹配字符串的行数 -n 选项
  1. grep "text" -n file_name
  2. 或
  3. cat file_name | grep "text" -n
  4. #多个文件
  5. grep "text" -n file_1 file_2
复制代码
20)搜刮多个文件并查找匹配文本在哪些文件中
  1. grep -l "text" file1 file2 file3...
复制代码
4、grep递归搜刮文件

1)在多级目录中对文本举行递归搜刮
  1. grep "text" . -r -n
  2. # .表示当前目录
复制代码
2)忽略匹配样式中的字符大小写
  1. [root@localhost ~]# echo "hello world" | grep -i "HELLO"
  2. hello world
复制代码
3)选项 -e 制动多个匹配样式
  1. [root@localhost ~]# echo this is a text line | grep -e "is" -e "line" -o
  2. is
  3. is
  4. line
  5. #也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
  6. [root@localhost myfolder]# cat patfile
  7. aaa
  8. bbb
  9. [root@localhost myfolder]# echo aaa bbb ccc ddd eee | grep -f patfile -o
  10. aaa
  11. bbb
复制代码
4)在grep搜刮结果中包括或者排除指定文件
  1. #只在目录中所有的.php和.html文件中递归搜索字符"main()"
  2. grep "main()" . -r --include *.{php,html}
  3. #在搜索结果中排除所有README文件
  4. grep "main()" . -r --exclude "README"
  5. #在搜索结果中排除filelist文件列表里的文件
  6. grep "main()" . -r --exclude-from filelist
复制代码
5)grep静默输出
  1. grep -q "test" filename
  2. #不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
复制代码
6)打印出匹配文本之前或者之后的行
  1. #显示匹配某个结果之后的3行,使用 -A 选项:
  2. [root@localhost myfolder]# seq 10 | grep "5" -A 3
  3. 5
  4. 6
  5. 7
  6. 8
  7. #显示匹配某个结果之前的3行,使用 -B 选项:
  8. [root@localhost myfolder]# seq 10 | grep "5" -B 3
  9. 2
  10. 3
  11. 4
  12. 5
  13. #显示匹配某个结果的前三行和后三行,使用 -C 选项:
  14. [root@localhost myfolder]# seq 10 | grep "5" -C 3
  15. 2
  16. 3
  17. 4
  18. 5
  19. 6
  20. 7
  21. 8
  22. #如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
  23. [root@localhost myfolder]# echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
  24. a
  25. b
  26. --
  27. a
  28. b
复制代码
三、sed下令

sed 是一种在线编辑器,它一次处置处罚一行内容。处置处罚时,把当前处置处罚的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed下令处置处罚缓冲区中的内容,处置处罚完成后,把缓冲区的内容送往屏幕。接着处置处罚下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed重要用来自动编辑一个或多个文件;简化对文件的反复操纵;编写转换程序等。
1、根本语法
  1. sed [选项]... '{命令}' [输入文件]...
复制代码

  • 选项:控制sed的行为,如-i直接修改文件内容,-e答应多个编辑下令等。
  • 下令:用单引号括起来,指定要对文本实行的操纵。
  • 输入文件:指定sed要处置处罚的文件。如果未指定文件,sed将从标准输入读取数据。
2、常用选项


  • -e:添加一个编辑下令。
  • -f:从文件中读取编辑下令。
  • -i:直接修改文件内容。
  • -n:抑制默认输出,只输出被明白指定的行。
  • -r:启用扩展正则表达式支持。
  • -u:以原子方式更新文件(与 -i 一起使用)。
3、下令格式

sed 下令的根本格式是:
  1. [address][,address] command
复制代码

  • address:可以是行号或正则表达式,用于指定下令作用的范围。
  • command:要实行的操纵。
4、常用下令


  • p:打印匹配的行。
  • d:删除匹配的行。
  • s:替换文本。
  • i:在指定行之前插入文本。
  • a:在指定行之后追加文本。
  • c:替换匹配的行。
5、示例

1)打印文件的前几行
  1. sed -n '1,5p' filename
复制代码
-n选项和p下令一起使用,仅打印被p下令指定的行(这里是前1~5行)。
2)删除文件中的空行
  1. sed '/^$/d' filename
复制代码
使用正则表达式/^$/匹配空行,d下令删除这些行。
3)替换文本
  1. sed 's/old/new/g' filename
复制代码
将文件中的"old"替换为"new"。g标志体现全局替换(即每行中的所有匹配项)。
4)直接修改文件(危险动作,注意确认)
  1. sed -i 's/old/new/g' filename
复制代码
-i选项答应sed直接修改文件内容,而不是输出到标准输出。
5)在特定行之前或之后插入文本
  1. sed '3i\New line' filename  # 在第3行之前插入"New line"  
  2. sed '3a\New line' filename  # 在第3行之后追加"New line"
复制代码
6)替换整行
  1. sed '3c\This is a new line' filename
复制代码
将第3行替换为"This is a new line"。
7)替换字符串并生存结果
  1. sed -i 's/pattern/replacement/g' file.txt
复制代码
这将直接修改 file.txt 文件中的内容。
8)读取多个文件并应用相同的编辑
  1. sed 's/pattern/replacement/g' file1.txt file2.txt
复制代码
9)使用多个编辑下令
  1. sed -e 's/pattern1/replacement1/g' -e 's/pattern2/replacement2/g' file.txt
复制代码
10)使用行号指定编辑范围
  1. sed '1,10 s/pattern/replacement/g' file.txt
复制代码
11)以行为单位的新增/删除

将 ./file 的内容列出并且打印行号,同时删除2~5行内容:
  1. [root@localhost myfolder]# nl ./file | sed '2,5d'
  2.      1  11
  3.      6  66
  4.      7  77
  5.      8  88
  6.      9  99
  7. ......
复制代码
因为2~5行内容被删除了,所以就不显示2~5行的内容了。
只要删除第 2 行:
  1. [root@localhost myfolder]# nl ./file | sed '2d'
  2.      1  11
  3.      3  33
  4.      4  44
  5.      5  55
  6.      6  66
  7. ......
复制代码
要删除第 10 到末了一行:
  1. [root@localhost myfolder]# nl ./file | sed '10,$d'
  2.      1  11
  3.      2  22
  4.      3  33
  5.      4  44
  6.      5  55
  7.      6  66
  8.      7  77
  9.      8  88
  10.      9  99
复制代码
在第2行后面加上[drink tea]字样:
  1. [root@localhost myfolder]# nl ./file | sed '2a drink tea'
  2.      1  11
  3.      2  22
  4. drink tea
  5.      3  33
  6.      4  44
  7.      5  55
  8.      6  66
  9.      7  77
  10.      8  88
  11.      9  99
  12. ......
复制代码
在第2行前面加上[drink tea]字样:
  1. [root@localhost myfolder]# nl ./file | sed '2i drink tea'
  2.      1  11
  3. drink tea
  4.      2  22
  5.      3  33
  6.      4  44
  7.      5  55
  8.      6  66
  9.      7  77
  10. ......
复制代码
如果要增长两行以上,例如:[Drink tea or …..]与[drink beer?]:
  1. [root@localhost myfolder]# nl ./file | sed '2a Drink tea or ......\
  2. > drink beer?'
  3.      1  11
  4.      2  22
  5. Drink tea or ......
  6. drink beer?
  7.      3  33
  8.      4  44
  9.      5  55
  10. ...省略...
复制代码
每一行之间都必须要以反斜杠“\”来举行新行的添加。
12)以行为单位的替换与显示

将第2~5行的内容替换为[No 2~5]:
  1. [root@localhost myfolder]# nl ./file | sed '2,5c No 2~5'
  2.      1  11
  3. No 2~5
  4.      6  66
  5.      7  77
  6.      8  88
  7. ......
复制代码
通过这个方法我们就能够将数据整行取代了!
仅列出 ./file 文件内的第 5~7 行内容:
  1. [root@localhost myfolder]# nl ./file | sed -n '5,7p'
  2.      5  55
  3.      6  66
  4.      7  77
复制代码
13)数据的搜寻并显示

搜刮 ./file 有aa关键字的行,并且只输出匹配的行:
  1. [root@localhost myfolder]# nl ./file | sed -n '/aa/p'
  2.     17  aa
  3.     32  dsaaaaaaaaaassdasdassdadadssdasdasd3213213213
  4.     37  Gaaa
  5.     59  aaaaa
复制代码
其中使用-n体现只打印匹配的行。
14)数据的搜寻并删除

删除 ./file 所有包罗“22”的行,其他行输出:
  1. [root@localhost myfolder]# nl ./file | sed '/22/d'
  2.      1  11
  3.      3  33
  4.      4  44
  5.      5  55
  6.      6  66
  7. ......
复制代码
15)数据的搜寻并实行下令

搜刮 ./file 文件找到root对应的行,实行后面花括号中的一组下令,每个下令之间用分号分隔,这里把 test 替换为 testNew,再输出这行:
  1. [root@localhost myfolder]# nl ./file | sed -n '/root/{s/test/testNew/;p}'
  2.     32  testNew admin root
复制代码
如果只替换 ./file 的第一个 test 关键字为 testNew ,就退出:
  1. [root@localhost myfolder]# nl ./file | sed -n '/test/{s/test/testNew/;p;q}'
  2.     32  testNew admin root
复制代码
末了的q体现退出。
16)数据的搜寻并替换

除了整行的处置处罚模式之外,sed 还可以用行为单位举行部分数据的搜寻并取代。根本上 sed 的搜寻、替代与 vi 雷同:
  1. sed 's/要被取代的字串/新的字串/g'
复制代码
四、awk下令

awk是行处置处罚器:相比较屏幕处置处罚的优点,在处置处罚大文件时不会出现内存溢出或是处置处罚缓慢的问题,通常用来格式化文本信息。
awk处置处罚过程:依次对每一行举行处置处罚,然后输出。
1、根本语法
  1. awk [options] 'pattern {action}' [filename]
复制代码

  • options:下令行选项,用于控制awk的工作方式。这些选项包括设置字段分隔符、定义变量等。
  • pattern:模式匹配,用于指定哪些行或记录需要被处置处罚。模式可以是正则表达式、条件表达式或布尔表达式。如果省略pattern,则对所有行实行action。
  • action:当模式匹配成功时,需要实行的下令或语句。这些下令或语句可以是内置的awk下令,也可以是自定义的代码块。
  • filename:指定要处置处罚的文件名。如果省略,则默认从标准输入读取。
2、常用选项


  • -F fs 或 --field-separator=fs:设置字段分隔符,默认为空格。
  • -v var=val 或 --assign=var=val:定义变量及其初始值。
  • -f script-file 或 --file=script-file:从文件中读取awk脚本。
  • -i inplace 或 --inplace:直接在原文件上修改(注意:这个选项在GNU awk中可能不被支持,需要使用其他工具如sed实现)。
  • -n 或 --non-decimal-data:答应非十进制数被识别。
  • -W interactive 或 --interactive:以交互模式运行。
3、脚本语法

awk 脚本通常由模式(pattern)和动作(action)组成。根本形式为:
  1. pattern { action }
复制代码

  • pattern:一个表达式,如果为真,则实行 action。
  • action:一组要实行的下令。
如果省略 pattern,则默认为 true,意味着 action 将应用于每一行。
4、内置变量

awk 提供了一些内置变量来简化脚本编写:

  • ARGC:下令行参数的数量。
  • ARGV:下令行参数的数组。
  • ENVIRON:环境变量的数组。
  • FILENAME:当前文件名。
  • FNR:当前文件中的记录编号。
  • FS:字段分隔符。
  • NF:当前记录中的字段数量。
  • NR:所有处置处罚过的记录总数。
  • OFS:输出字段分隔符。
  • ORS:输出记录分隔符。
  • RS:输入记录分隔符。
5、函数

awk 提供了多种内置函数来处置处罚文本和数值数据:

  • print:输出数据。
  • printf:格式化输出数据。
  • getline:从文件中读取一行。
  • split:分割字符串到数组。
  • gsub:全局替换。
  • match:正则表达式匹配。
  • rand 和 srand:生成随机数。
  • sqrt, exp, log, sin, cos, atan2:数学函数。
  • tolower 和 toupper:转换字符串为小写或大写。
  • length:返回字符串长度。
  • index:返回子字符串的位置。
  • substr:获取子字符串。
  • mktime:转换日期字符串为时间戳。
6、awk下令形式
  1. awk [-F|-f|-v] 'BEGIN{} /pattern/ {command1;command2} END{}' [filename]
复制代码

  • [-F|-f|-v]  大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
  • ' '  引用代码块
  • BEGIN  初始化代码块,在对每一行举行处置处罚之前,初始化代码,重要是引用全局变量,设置FS分隔符
  • /pattern/  匹配代码块,可以是字符串或正则表达式
  • {}  下令代码块,包罗一条或多条下令
  • ;  多条下令使用分号分隔
  • END  结尾代码块,在对每一行举行处置处罚之后再实行的代码块,重要是举行终极计算或输出结尾摘要信息
  • [filename]  需要处置处罚的文件
7、特殊要点

$0体现整个当前行
$1每行第一个字段
$n当前记录的第n个字段,字段间由FS分隔
NF字段数量变量
NR每行的记录号,多文件记录递增
FNR与NR雷同,不过多文件记录不递增,每个文件都从1开始
\t制表符
\n换行符
FSBEGIN时定义分隔符(默认是任何空格)
RS输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~匹配,与==相比不是精确比较
!~不匹配,不精确比较
==等于,必须全部相等,精确比较
!=不等于,精确比较
&&逻辑与
|| 逻辑或
OFS输出字段分隔符, 默认也是空格,可以改为制表符等
ORS输出的记录分隔符,默认为换行符,即处置处罚结果也是一行一行输出到屏幕
-F'[:#/]'定义三个分隔符
8、示例

1) 打印所有行
  1. awk '{print}' file.txt
复制代码
2)打印特定列
  1. awk '{print $1}' file.txt  # 打印第一列
复制代码
3)计算总和
  1. awk '{sum += $1} END {print sum}' numbers.txt
复制代码
4)过滤特定模式
  1. awk '/pattern/ {print}' file.txt
复制代码
5)使用多个模式
  1. awk '/pattern1/ || /pattern2/ {print}' file.txt
复制代码
6)自定义分隔符
  1. awk -F: '{print $1}' /etc/passwd  # 使用冒号作为分隔符,打印/etc/passwd文件的第一列(用户名)
复制代码
9、注意事项


  • awk默认按行处置处罚文本,并使用空格作为字段分隔符。
  • awk支持变量定义、流程控制(如if、else、for、while)、数学函数和字符串函数等高级功能。
  • awk还提供了BEGIN和END两个特殊的模式块,BEGIN块在读取任何输入行之前实行,END块在读取完所有输入行之后实行。
  • awk中的$0代表整行文本,$1、$2、$3...代表第一个、第二个、第三个字段等。
  • awk还包罗一些内置变量,如NR(当前记录号,即行号)、NF(当前记录的字段数,即每行的列数)等。
这些只是 awk 基础使用的冰山一角。awk 的功能非常强盛,可以编写复杂的脚本来处置处罚各种各样的任务。
 
此文由博主经心撰写转载请生存此原文链接:https://www.cnblogs.com/xyh9039/p/18337347
版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!! 
回复

使用道具 举报

返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-10-17 18:01 , Processed in 0.021601 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表