- 세상의 모든 계산기 자유(질문) 게시판 일반 ()
(Nginx) "웹 크롤러 request 순위 확인" 스크립트 (우분투)
#!/bin/bash
# monip.sh
# Nginx access 로그에서 상위 25개 IP를 분석하여
# - Bot (Crawler)인 경우: User-Agent 문자열로 Bot 종류를 추출
# - User인 경우: whois 명령으로 Organization Name 조회
# 그리고 IP별 국가 정보(geoiplookup)를 추가하여 출력함
LOG_FILE="/var/log/nginx/access.log"
if [ ! -f "$LOG_FILE" ]; then
echo "로그 파일이 존재하지 않습니다: $LOG_FILE"
exit 1
fi
awk '
# Bot의 종류를 판별하는 함수
function get_bot_type(ua, ua_lower) {
ua_lower = tolower(ua)
if(ua_lower ~ /googlebot/) return "Googlebot"
if(ua_lower ~ /bingbot/) return "Bingbot"
if(ua_lower ~ /slurp/) return "Yahoo Slurp"
if(ua_lower ~ /duckduckbot/) return "DuckDuckBot"
if(ua_lower ~ /baiduspider/) return "Baiduspider"
if(ua_lower ~ /yandex/) return "YandexBot"
return "Unknown Bot"
}
# User-Agent 문자열을 바탕으로 사용자 종류를 판별
function classify_user_agent(ua) {
if(ua == "" || ua == "-") return "알 수 없음"
ua_lower = tolower(ua)
if(ua_lower ~ /bot|crawl|spider|slurp|mediapartners/) return "Bot (Crawler)"
return "User"
}
# geoiplookup 명령을 사용하여 IP의 국가 정보를 가져오는 함수
function get_country(ip, cmd, result, arr, country) {
cmd = "geoiplookup " ip " 2>/dev/null"
if ((cmd | getline result) > 0) {
# 예: "GeoIP Country Edition: US, United States"
split(result, arr, ":")
if(length(arr) > 1) {
country = arr[2]
gsub(/^[ \t]+|[ \t]+$/, "", country)
} else {
country = "Unknown"
}
} else {
country = "조회 실패"
}
close(cmd)
return country
}
{
# Combined log format 예제:
# 127.0.0.1 - - [14/Feb/2025:12:00:00 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 ..."
regex = "([^ ]*) - ([^ ]*) \\[([^\\]]*)\\] \"([^\"]*)\" ([^ ]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\""
if(match($0, regex, arr)) {
ip = arr[1]
referer = arr[7]
ua_str = arr[8]
count[ip]++ # IP별 요청 횟수 집계
ua_stats[ip, ua_str]++ # IP별 User-Agent 빈도 집계
ref_stats[ip, referer]++ # (참고용) 리퍼러 집계
}
}
END {
# gawk의 asorti() 함수로 요청 횟수 기준 내림차순 정렬
n = asorti(count, sorted, "@val_num_desc")
# 헤더 출력 (순서: 순위 | IP | 국가 | Requests | 사용자 종류 | 기타정보)
printf("| %-2s | %-15s | %-18s | %-10s | %-17s | %-21s |\n", "순위", "IP", "국가", "Requests", "사용자 종류", "기타정보")
print("|------|-----------------|----------------------|------------|------------------------|-------------------------|")
limit = (n < 25 ? n : 25)
for(i = 1; i <= limit; i++){
ip = sorted[i]
req_count = count[ip]
# 해당 IP의 가장 많이 등장한 User-Agent 선택
max_ua = ""
max_ua_count = 0
for(key in ua_stats) {
split(key, parts, SUBSEP)
if(parts[1] == ip) {
if(ua_stats[key] > max_ua_count) {
max_ua_count = ua_stats[key]
max_ua = parts[2]
}
}
}
user_type = classify_user_agent(max_ua)
extra = ""
if(user_type == "User") {
# User인 경우: whois 명령으로 Organization Name 조회
cmd = "whois " ip " 2>/dev/null | grep -i -m 1 \"orgname:\""
org = ""
if((cmd | getline org) > 0) {
sub(/^[ \t]+/, "", org)
split(org, a, ":")
if(length(a) > 1) {
org = a[2]
gsub(/^[ \t]+/, "", org)
}
} else {
org = "조회 실패"
}
close(cmd)
extra = org
} else if(user_type == "Bot (Crawler)") {
extra = get_bot_type(max_ua)
} else {
extra = "없음"
}
# 각 IP의 국가 정보 추가
country = get_country(ip)
printf("| %-4d | %-15s | %-20s | %-10d | %-22s | %-25s |\n", i, ip, country, req_count, user_type, extra)
}
}
' "$LOG_FILE"
사용 방법
- 스크립트를 파일에 저장 후 실행 권한 부여:
chmod +x monip.sh - 스크립트 실행 (필요한 경우 sudo로):
sudo ./monip.sh
결과

세상의모든계산기 님의 최근 댓글
일반 계산기는 일반적으로 세팅이나 리셋기능이 따로 없기 때문에, 다른 요인에 영향을 받을 가능성은 없어 보이구요. '원래는 잘 되었는데, 지금은 설정 값이 날아간다'면 메모리 값을 유지할만큼 배터리가 꾸준하게 공급되지 않기 때문일 가능성이 높다고 봐야겠습니다. - 태양광이 있을 때는 계산은 가능하지만, 서랍등에 넣으면 배터리가 없어서 리셋 https://blog.naver.com/potatoyamyam/223053309120 (교체 사진 참조) 1. 배터리 준비: * 다이소 등에서 LR54 (LR1130) 배터리를 구매합니다. (보통 4개 들이 1,000원에 판매됩니다. LR44와 높이가 다르니 혼동하시면 안됩니다.) 2. 준비물: * 작은 십자드라이버 (계산기 뒷면 나사용. 이것도 없으시면 다이소에서...) 3. 커버 분해: * 계산기 뒷면의 나사를 풀고, 머리 부분(윗부분)의 커버를 조심스럽게 분해합니다. (참고해주신 블로그 사진을 보시면 이해가 빠르실 겁니다.) 4. 배터리 교체: * 기존 배터리를 빼냅니다. * 새 LR54 배터리의 '+'극 방향을 정확히 확인하여 제자리에 넣어줍니다. (대부분의 경우 '+'극이 위로 보이도록 넣습니다.) 5. 조립: * 커버를 다시 닫고 나사를 조여줍니다. * 블로그 사진을 보니 배터리 연결선 등이 눌려서 씹혀 있네요. 원래 씹히도록 설계를 안하는데, 원래 그렇게 만들어 놓은 건지? 모르겠네요. 여튼 씹히면 단선될 가능성이 있으니, 잘 보시고 플라스틱 틈새 등으로 적절히 배치해서 안씹히게 하는 것이 좋습니다. 6. TAX 재설정: * 계산기의 전원을 켜고 TAX 요율을 10%로 다시 설정합니다. 2025 12.10 TI-nspire 입력 방법 solve({x+a+b=5,x)|a=1 and b=2 2025 12.01 질문하실 때는 항상 계산기 모델명을 정확하게 적으셔야 합니다. 2025 12.01 참고 - [공학용 계산기] 로그의 입력 (log, ln) (feat. 밑 입력이 안되는 계산기는?) https://allcalc.org/14995 2025 11.14 HP-39gII 에 ExistOS 설치하기 https://allcalc.org/38526 2025 11.07