คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )


3
คุณจะลบอักขระ dot ออกจากสตริงโดยไม่เรียกใช้ sed หรือ awk อีกครั้งได้อย่างไร
ฉันมีไฟล์ชื่อhostlist.txtที่มีข้อความเช่นนี้: host1.mydomain.com host2.mydomain.com anotherhost www.mydomain.com login.mydomain.com somehost host3.mydomain.com ฉันมีสคริปต์เล็ก ๆ ต่อไปนี้: #!/usr/local/bin/bash while read host; do dig +search @ns1.mydomain.com $host ALL \ | sed -n '/;; ANSWER SECTION:/{n;p;}'; done <hostlist.txt \ | gawk '{print $1","$NF}' >fqdn-ip.csv ซึ่งส่งออกไปที่fqdn-ip.csv: host1.mydomain.com.,10.0.0.1 host2.mydomain.com.,10.0.0.2 anotherhost.internal.mydomain.com.,10.0.0.11 www.mydomain.com.,10.0.0.10 login.mydomain.com.,10.0.0.12 somehost.internal.mydomain.com.,10.0.0.13 host3.mydomain.com.,10.0.0.3 คำถามของฉันคือฉันจะลบ.ก่อนจุลภาคโดยไม่ต้องกล่าวอ้างsedหรือgawkอีกครั้งหรือไม่ มีขั้นตอนที่ฉันสามารถแสดงในสายที่มีอยู่sedหรือgawkสายที่จะตัดจุดได้หรือไม่? hostlist.txt จะมีโฮสต์ 1,000 แห่งดังนั้นฉันต้องการให้สคริปต์ของฉันเร็วและมีประสิทธิภาพ

4
แทรกข้อความที่หมายเลขบรรทัดเฉพาะ
ฉันกำลังทำงานกับสคริปต์ทุบตีที่จะแยกเนื้อหาของเอกสารข้อความขึ้นอยู่กับข้อมูลในบรรทัด หากเนื้อหาของไฟล์ต้นฉบับอยู่ในแนวของ 01 line 01 line 02 line 02 line ฉันจะแทรกลงในบรรทัดที่ 3 ของไฟล์นี้โดยใช้ bash เพื่อให้ได้ผลลัพธ์อย่างไร 01 line 01 line text to insert 02 line 02 line ฉันหวังว่าจะทำเช่นนี้โดยใช้ heredoc หรือสิ่งที่คล้ายกันในสคริปต์ของฉัน #!/bin/bash vim -e -s ./file.txt <<- HEREDOC :3 | startinsert | "text to insert\n" :update :quit HEREDOC ข้างต้นใช้งานไม่ได้ แต่มีคำแนะนำใดบ้างที่ฉันสามารถนำไปใช้กับสคริปต์ทุบตีนี้ได้

4
ใช้เคส / ตัวอย่างการปฏิบัติสำหรับ Bash 'builtin exec
พิจารณาจากเอกสารของ Bash 'builtin exec: exec แทนที่เชลล์โดยไม่ต้องสร้างกระบวนการใหม่ โปรดระบุกรณีการใช้งาน / ตัวอย่างการปฏิบัติ ฉันไม่เข้าใจว่าสิ่งนี้สมเหตุสมผลหรือไม่ ฉัน googled และพบเกี่ยวกับI / O เปลี่ยนเส้นทาง คุณช่วยอธิบายให้ดีขึ้นได้ไหม?


1
ทราบว่ากระบวนการใดที่ I / O ไม่มี iotop
บน Linux ฉันต้องการทราบว่ากระบวนการใดใช้ Band I ของดิสก์ I / O ของฉัน ฉันรู้ว่าฉันสามารถใช้งานได้iotopแต่ฉันมีเครื่องที่iotopไม่สามารถติดตั้งด้วยเหตุผลต่าง ๆได้ ฉันจะรับข้อมูลด้วยตนเองได้อย่างไร ( iotopตัวเองดำเนินการอย่างไร)

7
ฉันจะรับรุ่น ksh อย่างปลอดภัยได้อย่างไร
ฉันจะรับรุ่น ksh อย่างปลอดภัยจากภายในสคริปต์ ksh ได้อย่างไร ฉันได้เห็นวิธีแก้ไขปัญหาต่อไปนี้ : ksh --version echo ${.sh.version} echo $KSH_VERSION และเมื่อได้รับสถานการณ์ที่เหมาะสมแต่ละงานเหล่านี้ถูกต้อง อย่างไรก็ตามฉันสนใจกรณีที่ไม่สมบูรณ์ โดยเฉพาะมีหลายเครื่องที่ฉันทำงานด้วยที่มีรุ่นเก่ากว่า ksh ที่สำหรับวัตถุประสงค์ของฉันขาดฟังก์ชั่นอย่างรุนแรง อย่างไรก็ตามเหตุผลที่ฉันต้องการตรวจสอบรุ่น (โดยทางโปรแกรม) คือดูว่ารุ่น ksh เป็นหนึ่งในรุ่นที่มีความสามารถน้อยกว่าหรือไม่ และถ้าเป็นเช่นนั้นฉันต้องการรันสาขาด้วยรหัสที่ยอดเยี่ยมน้อยลง อย่างไรก็ตามในเครื่องที่มีปัญหาความไม่สมบูรณ์ของเชลล์จะขยายไปสู่การตรวจสอบเวอร์ชัน ... ถ้าฉันลองksh --versionมันจะพิมพ์ออกมาและเปิดตัวอย่างใหม่ของksh! หากฉันลองecho ${.sh.version}ให้kshถือว่านี่เป็นข้อผิดพลาดทางไวยากรณ์ที่ไม่สามารถทิ้ง2> /dev/nullได้ $ echo ${.sh.version} 2> /dev/null ksh: ${.sh.version}: bad substitution แน่นอนecho $KSH_VERSIONว่าใช้งานได้ดี - ฉันหมายความว่ามันจะไม่ผิดพลาด - แม้ว่าเครื่องเหล่านี้จะว่างเปล่า นอกจากนี้ผมเห็นที่ไหนสักแห่งที่มีการตั้งค่าโดยเฉพาะKSH_VERSIONpdksh คำถาม: ฉันจะตรวจสอบเวอร์ชั่นของkshโปรแกรมอย่างปลอดภัยได้อย่างไร kshสำหรับวัตถุประสงค์ของฉันที่นี่ฉันไม่สนใจสิ่งที่หมายเลขรุ่นที่เกิดขึ้นจริงเป็นเพียงแค่ไม่ว่าจะเป็นรุ่นเก่า …

4
สร้างไดเรกทอรีซ้ำสำหรับตัวอักษรทั้งหมด
ฉันต้องการที่จะสร้างไดเรกทอรีในลักษณะดังกล่าวที่ฉันต้องการที่จะติดป้ายไดเรกทอรีที่จากไปa zภายในแต่ละไดเรกทอรีเหล่านี้ผมจำเป็นต้องสร้างไดเรกทอรีย่อยเพื่อให้พวกเขาได้รับการระบุว่าเป็นaa, abฯลฯ ดังนั้นสำหรับตัวอย่างเช่นสำหรับไดเรกทอรีmไดเรกทอรีย่อยของฉันจะได้รับการระบุว่าเป็นma, ไม่เกินmbmz

7
วิธีที่สั้นที่สุดในการแยก 3 ชื่อสุดท้ายของชื่อไฟล์ฐาน (ลบด้วยคำต่อท้าย)
ฉันพยายามตั้งค่าตัวแปรในสคริปต์ sh เป็น 3 ตัวอักษรสุดท้ายของชื่อฐานของไฟล์ (โดยชื่อฐานฉันหมายถึงไม่มีเส้นทางและไม่มีคำต่อท้าย) ฉันประสบความสำเร็จในการทำสิ่งนี้ แต่ด้วยความอยากรู้อยากเห็นอย่างหมดจดฉันสงสัยว่ามีคำสั่งสั้นเพียงคำเดียวที่ฉันสามารถใช้ได้ เดิมทีฉันมีซับในด้วยawkแต่มันค่อนข้างยาว ขณะนี้ฉันมีสคริปต์สองบรรทัดนี้ (สมมติว่ามีชื่อไฟล์ที่สมบูรณ์อยู่$1): filebase=`basename "$1"` lastpart=`echo -n ${filebase%.*} | tail -c3` ดังนั้นสำหรับตัวอย่างเช่น"/path/to/somefile.txt"จบลงด้วย"ile"$lastpartใน ฉันสามารถรวมbasenameและบิตเพื่อตัดส่วนต่อท้ายเป็นคำสั่งเดียวได้หรือไม่และมีวิธีส่งไปยังtail(หรืออย่างอื่นที่ฉันสามารถใช้ได้) โดยไม่ต้องใช้ไพพ์หรือไม่? ไม่รู้จักคำต่อท้ายดังนั้นฉันไม่สามารถยึดเป็นพารามิเตอร์basenameได้ เป้าหมายหลักนั้นไม่สั้นมากเท่าที่จะเป็นไปได้ บริบทที่แท้จริงของทั้งหมดนี้คือคำถามเกี่ยวกับ Superuserที่ฉันพยายามหาคำตอบที่เรียบง่ายพอสมควร

2
ค้นหาและลบรายการที่ซ้ำในไดเรกทอรี
ฉันมีไดเรกทอรีที่มีไฟล์ img หลายไฟล์และบางไฟล์เหมือนกัน แต่มีชื่อแตกต่างกัน ฉันต้องการลบรายการที่ซ้ำกัน แต่ไม่มีเครื่องมือภายนอกที่มีbashสคริปต์เท่านั้น ฉันเป็นผู้เริ่มต้นใน Linux ฉันลองซ้อนสำหรับ loop เพื่อเปรียบเทียบmd5ผลรวมและขึ้นอยู่กับผลการลบ แต่มีบางอย่างผิดปกติกับไวยากรณ์และมันไม่ทำงาน ความช่วยเหลือใด ๆ สิ่งที่ฉันพยายามคือ ... for i in directory_path; do sum1='find $i -type f -iname "*.jpg" -exec md5sum '{}' \;' for j in directory_path; do sum2='find $j -type f -iname "*.jpg" -exec md5sum '{}' \;' if test $sum1=$sum2 ; …

2
ตรวจสอบว่าทำงานใน terminal เสมือนหรือไม่
ฉันต้องการที่จะautologinไปtty1เมื่อเข้าสู่ระบบแล้วใช้vlockเพื่อล็อค ฉันจะตรวจจับจาก Bash ได้อย่างไรถ้าเทอร์มินัลปัจจุบันเป็นคอนโซลเทอร์มินัลเสมือน (เช่นtty1) เพื่อที่ฉันจะสามารถวางvlockสายเข้า.bash_profileและทำงานได้ก็ต่อเมื่อลงชื่อเข้าใช้ผ่านtty1เท่านั้น

4
เปลี่ยนชื่อไฟล์ในโฟลเดอร์ท้องถิ่นเพิ่มคำนำหน้าหรือคำต่อท้าย
ฉันมีไฟล์จำนวนมากในโฟลเดอร์และฉันต้องการเพิ่มคำนำหน้าหรือคำต่อท้าย (ไม่ใช่ทั้งคู่ ) ลงในพวกเขา ฉันตรวจสอบที่นี่และพบว่าฉันสามารถใช้ได้ for filename in *.jpg; do mv "$filename" "prefix_$filename"; done; เพื่อเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดที่ลงท้ายด้วย.jpg(และถ้าฉันลบออก.jpgมันจะเพิ่มคำนำหน้าให้กับไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบัน) อย่างไรก็ตามฉันต้องการที่จะสามารถ เพิ่ม sufix (นั่นคือเปลี่ยนชื่อfilename.extเป็นfilename.whatever.ext) ตรวจสอบว่าคำนำหน้าหรือคำต่อท้ายมีอยู่แล้วและข้าม สร้างนามแฝงที่ยอมรับข้อโต้แย้งเช่นaddprefix whatever *.extหรือaddsufix whatever *.*

1
วิธีรวมสคริปต์หลายบรรทัด awk ในเชลล์สคริปต์
คำถามของฉันคือความต่อเนื่องของ วิธีแยกไฟล์เพื่อแยกตัวเลข 3 หลักที่เก็บใน "หมายเลขกลุ่ม" ฉันพยายามรวมในเชลล์สคริปต์ชุดเดียวของคำสั่งที่ แยกมาตรฐานยุโรปเพื่อแยกลำดับการทดสอบ แปลงการเข้ารหัสข้อความเป็น utf8 ประมวลผลผลลัพธ์ด้วยรูทีน awk ที่ให้ไว้กับฉันในโพสต์ด้านบน บันทึกเนื้อหาในไฟล์ปลายทาง ฉันเขียนสคริปต์ด้านล่างอย่างไม่แน่นอน ผมสามารถที่จะบรรลุเท่านั้นstep 1และstep 4แต่ไม่ว่ามิได้step 2 step 3ฉันสงสัยว่าควรสร้างไฟล์ระดับกลาง (ชั่วคราว) หรือไม่ ฉันพยายามเก็บผลลัพธ์ของขั้นตอนกลางไว้ในตัวแปร แต่ไม่ประสบความสำเร็จ ความช่วยเหลือใด ๆ ก็จะเป็นประโยชน์ในเรื่องข้อผิดพลาดและวิธีที่ดีที่สุดในการทำเช่นนี้ #!/bin/bash # creating the Latex code for a test procedure awkcommand= "/usr/bin/awk ' $1 == "Group" {printf("\\section{%s %d}\n", $1, $2); next} { title …
12 shell-script  awk 

2
ฉันจะรันเชลล์สคริปต์เป็น daemon ภายใต้ Redhat ได้อย่างไร
ฉันมีเชลล์สคริปต์ซึ่งโดยพื้นฐานแล้วจะเป็นซับไฟล์หนึ่งที่มีการบันทึกซึ่งฉันพยายามเรียกใช้จากสคริปต์เริ่มต้น ฉันกำลังใช้daemonฟังก์ชั่นด้านในของ/etc/init.d/functionsการเรียกใช้เพราะ Redhat ไม่start-stop-daemonพร้อมใช้งาน เมื่อฉันเรียกสคริปต์เริ่มต้น ( /etc/init.d/script start) สคริปต์จะยังคงอยู่เบื้องหน้าแทนที่จะทำจนเสร็จและปล่อยให้กระบวนการทำงาน อะไรคือวิธีที่เหมาะสมสำหรับฉันที่จะกำจัดสคริปนี้? สคริปต์ที่จะทำงาน: # conf file where variables are defined . /etc/script.conf echo "Starting..." | logger -i echo "Monitoring $LOG_LOCATION." | logger -i echo "Sending to $MONITOR_HOST:$MONITOR_PORT." | logger -i tail -n 1 -F $LOG_LOCATION | grep WARN --line-buffered | /usr/bin/nc -vv …

2
วิธีเริ่มต้นปรับแต่งไฟล์ที่ยังไม่ได้สร้าง
ฉันใช้tailในการตรวจสอบความคืบหน้าของงานที่ฉันรู้ว่าจะเขียนความคืบหน้าของพวกเขาไปยังดิสก์ เกือบตลอดเวลาฉันรู้ว่าไฟล์ใดที่พวกเขาจะสร้างก่อนที่จะเริ่มทำงาน (งานถูกส่งโดยตัวจัดตารางเวลาในซูเปอร์คอมพิวเตอร์) มีวิธีในการtailไฟล์เหล่านี้ก่อนที่จะสร้าง? ฉันต้องการทำเช่นนั้นในขณะที่หลีกเลี่ยงสภาพการแข่งขันและ / หรือการตั้งสมมติฐานเกี่ยวกับวิธีการหรือเมื่องานเขียนไปยังดิสก์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.